library(latex2exp)
library(tidyverse)
library(ggpubr)
#load the data ###AIC values of the 4 scenarios along with the
parameters estimated
aic.df <- read_csv("~/plots/all_data/aic.csv")
###add the replicate info
aic.df <- aic.df %>%
mutate(exp.field = paste0(str_split(cell.id, "_", simplify = T)[,2],"_",
str_split(cell.id, "_", simplify = T)[,3]),
colony = case_when(exp.field %in% c("20min_s3", "20min_s4") ~ "Replicate 1",
exp.field %in% c("20min_s5", "20min_s6") ~ "Replicate 2",
exp.field %in% c("20min_s7", "20min_s8" , "20min_s9") ~ "Replicate 3"))
aic.df <- aic.df %>%
mutate(colony = ifelse(degron == "stable" & red == "pup1-rfp",
case_when(exp.field %in% c("20min_s4", "20min_s5") ~ "Replicate 1",
exp.field %in% c("20min_s6", "20min_s7") ~ "Replicate 2",
exp.field %in% c("20min_s8", "20min_s9") ~ "Replicate 3"), colony))
# filter(value < 0.05)
###Cellular attributes
pup1.cell.attr <- read_csv("~/plots/all_data/all_pup1_cell_attr.csv")
#pup1-RFP background
pup1.cell.attr <- pup1.cell.attr %>%
mutate(exp.field = paste0(str_split(cell.id, "_", simplify = T)[,2],"_",
str_split(cell.id, "_", simplify = T)[,3]),
colony = case_when(exp.field %in% c("20min_s3", "20min_s4") ~ "Replicate 1",
exp.field %in% c("20min_s5", "20min_s6") ~ "Replicate 2",
exp.field %in% c("20min_s7", "20min_s8" , "20min_s9") ~ "Replicate 3"))
pup1.cell.attr <- pup1.cell.attr %>%
mutate(colony = ifelse(degron == "stable" & red == "pup1-rfp",
case_when(exp.field %in% c("20min_s4", "20min_s5") ~ "Replicate 1",
exp.field %in% c("20min_s6", "20min_s7") ~ "Replicate 2",
exp.field %in% c("20min_s8", "20min_s9") ~ "Replicate 3"), colony))
multiple.pup1 <- pup1.cell.attr %>%
mutate(dapi.mean.bg.sub.puncta = ifelse(is.na(dapi.mean.bg.sub.puncta), 0, dapi.mean.bg.sub.puncta) ,
rfp.mean.bg.sub.puncta = ifelse(is.na(rfp.mean.bg.sub.puncta), 0 , rfp.mean.bg.sub.puncta)) %>%
filter(rfp.mean.bg.sub.puncta > 0) %>% group_by(cell.id) %>% tally() %>% filter(n>1)
pup1.cell.attr <- pup1.cell.attr %>%
group_by(cell.id) %>%
mutate(rfp.mean.bg.sub.puncta = ifelse(cell.id %in% multiple.pup1$cell.id , mean(rfp.mean.bg.sub.puncta), rfp.mean.bg.sub.puncta )) %>%
distinct(cell.id, .keep_all = TRUE)
###Number of data points for each cell
no.of.dp <- read_csv("~/plots/all_data/all_exp_data.csv") %>%
filter(cell.id %in% figS2.df$cell.id) %>%
group_by(cell.id) %>%
tally()
no.of.dp %>% filter(n > 31)
#dy estimated using the 1-parameter exponential and 2-parameter with
maturation model We need both the models because we are comparing the
rate of decay from both the models
dy.pup1 <- aic.df %>%
filter(red == "pup1-rfp") %>%
filter(ifelse(degron %in% c("stable.2","stable","stabe.3"), dy < 0.1, dy < 0.5)) %>%
group_by(cell.id) %>%
mutate(dm = ifelse(is.na(dm), Inf, dm)) %>%
filter( dm > 0.00001) %>%
filter(model %in% c("dy.dm","exponential"))
#number of cells that converged in both the models
dy.pup1 %>%
filter(degron %in% c("mODC.2","cln2.3","cln2.4","stable.2","stable.3")) %>%
select(cell.id, model, dy, aic,degron) %>%
pivot_wider(values_from = c("dy","aic"), names_from = model) %>%
na.omit() %>%
group_by(degron) %>%
tally()
Error in select(., cell.id, model, dy, aic, degron) :
unused arguments (cell.id, model, dy, aic, degron)
Final df used to generate the figures
figS2.df <- dy.pup1 %>%
filter(treatment == "none") %>%
left_join(.,pup1.cell.attr %>%
filter(red == "pup1-rfp", treatment == "none"),
by = c("cell.id","treatment","degron","red","colony","exp.field")) %>%
mutate(dapi.mean.bg.sub.puncta = ifelse(is.na(dapi.mean.bg.sub.puncta), 0, dapi.mean.bg.sub.puncta) ,
rfp.mean.bg.sub.puncta = ifelse(is.na(rfp.mean.bg.sub.puncta), 0 , rfp.mean.bg.sub.puncta)) %>%
filter(rfp.mean.bg.sub.puncta > 0) %>%
filter(ifelse(degron %in% c("stable.3","stable.2"), dy < 0.1, dy < 0.5))
Looking at how many cells converged in the mat model and in
exponential model
#total no. of cells which converged in the the maturation + decay model but not in the exponential model
figS2.df %>%
dplyr::select(cell.id, dy, model, degron) %>%
dplyr::ungroup() %>%
pivot_wider(values_from = dy, names_from = model) %>%
filter(is.na(exponential)) %>%
group_by(degron) %>%
tally()
#total no. of cells which converged in the exponential model but not in the maturation + decay model
figS2.df %>%
dplyr::select(cell.id, dy, model, degron) %>%
dplyr::ungroup() %>%
pivot_wider(values_from = dy, names_from = model) %>%
filter(is.na(dy.dm)) %>%
group_by(degron) %>%
tally()
#percent of cells with lowest AIC scores in each model
#underestimation of decay rates by exponential model grouped by
figS2.df %>%
dplyr::select(cell.id, dm, dy, model, degron, gfp.mean.bg.af.sub.new) %>%
dplyr::ungroup() %>%
pivot_wider(values_from = c("dy","dm"), names_from = model) %>%
mutate(dm.level = ifelse(dm_dy.dm > 1, ">1", "<1"),
exp.mat.ratio = ((dy_dy.dm - dy_exponential)/dy_dy.dm)*100) %>%
filter(!(is.na(exp.mat.ratio)))%>%
filter(degron %in% c("mODC.2","cln2.3","stable.3","stable.2","cln2.4")) %>%
mutate(degron = case_when(degron %in% c("cln2.3","cln2.4") ~ "GFP-CLN2",
degron %in% c("mODC.2") ~ "GFP-mODC",
degron %in% c("stable.2","stable.3") ~ "GFP"),
degron = factor(degron, levels = c("GFP-mODC","GFP-CLN2","GFP"))) %>%
group_by(degron, dm.level) %>%
summarise(median(exp.mat.ratio) %>% signif(.,digits = 2),
sd(exp.mat.ratio),
NROW(exp.mat.ratio))
`summarise()` has grouped output by 'degron'. You can override using the `.groups` argument.
figS2.df %>%
dplyr::select(cell.id, dy, model, degron, gfp.mean.bg.af.sub.new) %>%
dplyr::ungroup() %>%
pivot_wider(values_from = dy, names_from = model) %>%
mutate(exp.mat.ratio = (dy.dm - exponential)/dy.dm) %>%
filter(!(is.na(exp.mat.ratio))) %>%
filter(degron %in% c("mODC.2","cln2.3","cln2.4","stable.3","stable.2")) %>%
mutate(degron = case_when(degron %in% c("cln2.3","cln2.4") ~ "GFP-CLN2",
degron %in% c("mODC.2") ~ "GFP-mODC",
degron %in% c("stable.2","stable.3") ~ "GFP"),
degron = factor(degron, levels = c("GFP-mODC","GFP-CLN2","GFP"))) %>%
ggplot(.,aes(x = gfp.mean.bg.af.sub.new, y = exp.mat.ratio))+
geom_point(size = 0.2)+
facet_wrap(~degron, scales = "free")+
theme_pubr()
#bar plot to show which model best explains the decay
figS2.df %>%
filter(model %in% c("dy.dm","exponential")) %>%
group_by(cell.id) %>%
filter(aic == min(aic)) %>%
ungroup() %>%
# pivot_wider(names_from = name, values_from = value) %>%
group_by(treatment, red, degron, colony,model) %>%
tally() %>%
ungroup() %>%
filter(treatment == "none") %>%
ggplot(.,aes(x = model, y= n, fill = colony))+
geom_col(position = "dodge")+
facet_wrap(~degron, scales = "free")
# theme(axis.text.x = element_text(angle = 45, hjust = 1))
aic.df %>%
filter(model %in% c("dy.dm","exponential")) %>%
group_by(cell.id) %>%
filter(aic == min(aic)) %>%
ungroup() %>%
# pivot_wider(names_from = name, values_from = value) %>%
group_by(treatment, red, degron, model) %>%
tally() %>%
ungroup() %>%
filter(treatment != "none") %>%
ggplot(.,aes(x = model, y= n))+
geom_col()+
facet_wrap(~treatment, scales = "free_y")+
theme(axis.text.x = element_text(angle = 45, hjust = 1))
high.dm <- figS2.df %>%
filter(model %in% c("dy.dm")) %>%
filter( treatment == "none", red == "pup1-rfp") %>%
filter(dm > 1)
low.dm <- figS2.df %>%
filter(model %in% c("dy.dm")) %>%
filter(treatment == "none", red == "pup1-rfp") %>%
filter(dm < 1)
#modified supplemtal figures #the values of dy when
#cln2
figS2.df %>%
filter(model %in% c("dy.dm","exponential") ) %>%
filter(degron %in% c("cln2","cln2.2","cln2.3","cln2.4"), treatment == "none", red == "pup1-rfp") %>%
filter(dy < 0.5) %>%
mutate(dm.level = ifelse(cell.id %in% high.dm$cell.id , "High", "low")) %>%
select(cell.id, degron, dy, model, dm.level) %>%
pivot_wider(values_from = dy, names_from = model) %>%
ggplot(.,aes(x = exponential, y = dy.dm, color = dm.level))+
geom_point(size = 0.5)+
geom_abline(slope = 1, color = "firebrick1")+
stat_cor()+
theme_pubr()+
xlab(TeX("Rate of Decay from a one parameter model (Eq. 8), $\\delta , min^{-1}$"))+
ylab(TeX("Rate of Decay from a model with maturation (Eq. 6), $\\delta , min^{-1}$"))+
theme(text = element_text(size = 8))
#stable
figS2.df %>%
filter(rfp.mean.bg.sub.puncta > 0) %>%
filter(model %in% c("dy.dm","exponential") ) %>%
filter(degron %in% c("stable","stable.2","stable.3"), treatment == "none", red == "pup1-rfp") %>%
filter(dy < 0.1) %>%
mutate(dm.level = ifelse(cell.id %in% high.dm$cell.id , "High", "low")) %>%
select(cell.id, degron, dy, model, dm.level) %>%
pivot_wider(values_from = dy, names_from = model) %>%
ggplot(.,aes(x = exponential, y = dy.dm, color = dm.level))+
geom_point(size = 0.5)+
geom_abline(slope = 1, color = "firebrick1")+
stat_cor()+
theme_pubr()+
xlab(TeX("Rate of Decay from a one parameter model (Eq. 8), $\\delta , min^{-1}$"))+
ylab(TeX("Rate of Decay from a model with maturation (Eq. 6), $\\delta , min^{-1}$"))+
theme(text = element_text(size = 8))
#dm values histogram
dm.distPlt
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

#percent of cells with dm values > 1 and < 1 in the maturation
model

modc.dy.comparePlt
Warning: Removed 570 rows containing non-finite values (stat_cor).
Warning: Removed 570 rows containing missing values (geom_point).

figS2.df %>%
filter(model == "dy.dm", red == "pup1-rfp", treatment =="none", degron %in% c("mODC.2","cln2.3","cln2.4","stable.2","Stable.3")) %>%
left_join(.,no.of.dp, by = "cell.id") %>%
group_by(cell.id) %>%
mutate(rmsd = sqrt(value/n)) %>%
ungroup() %>%
group_by(degron, colony) %>%
mutate(rmsd.mean.norm = rmsd/mean(rmsd)) %>%
ggplot(.,aes(x = rmsd.mean.norm ))+
geom_histogram()+
facet_grid(colony~degron, scales = "free")
figS2.df %>%
filter(model == "dy.dm", red == "pup1-rfp", treatment =="none", degron %in% c("mODC.2","cln2.3","cln2.4","stable.2","Stable.3")) %>%
left_join(.,no.of.dp, by = "cell.id") %>%
group_by(cell.id) %>%
mutate(rmsd = sqrt(value/n))%>%
ungroup() %>%
group_by(degron, colony) %>%
mutate(rmsd.mean.norm = rmsd/mean(rmsd)) %>%
ggplot(.,aes(x = rmsd ))+
geom_histogram()+
facet_grid(colony~degron, scales = "free")
figS2.df %>%
filter(red == "pup1-rfp", treatment =="none", degron %in% c("mODC.2","cln2.3","cln2.4","stable.2","Stable.3")) %>%
left_join(.,no.of.dp, by = "cell.id") %>%
group_by(cell.id) %>%
mutate(rmsd = sqrt(value/n))%>%
ungroup() %>%
group_by(degron, model) %>%
mutate(rmsd.mean.norm = rmsd/mean(rmsd)) %>%
filter(rmsd < 0.) %>%
ggplot(.,aes(x = rmsd, color = model))+
geom_freqpoly()+
facet_wrap(~degron, scales = "free")+
theme_pubr()+
theme(text = element_text(size = 8))
#aic scores
aic.score.plt
Warning: Removed 923 rows containing missing values (geom_point).

aic.score.ptDenPlt
Warning: Removed 1492 rows containing non-finite values (stat_pointdensity).

#dy scatterplot
dy.models.scatPlt
Warning: Removed 1491 rows containing non-finite values (stat_pointdensity).

distributions of dy geoom_freak_poly
dy.models.den.plt
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Underestimation of the decay rates Decay rates are higher in the
maturation model compared to the exponential model
df.underEst <- figS2.df %>%
dplyr::select(cell.id, dm, dy, model, degron, gfp.mean.bg.af.sub.new) %>%
dplyr::ungroup() %>%
pivot_wider(values_from = c("dy","dm"), names_from = model) %>%
mutate(dm.level = ifelse(dm_dy.dm > 1, ">1", "<1"),
exp.mat.ratio = ((dy_dy.dm - dy_exponential)/dy_dy.dm)*100) %>%
filter(!(is.na(exp.mat.ratio)))%>%
filter(degron %in% c("mODC.2","cln2.4","cln2.3","stable.2","stable.3")) %>%
mutate(degron = case_when(degron %in% c("cln2.3","cln2.4") ~ "yeGFP-CLN2",
degron %in% c("mODC.2") ~ "yeGFP-mODC",
degron %in% c("stable.2","stable.3") ~ "yeGFP"),
degron = factor(degron, levels = c("yeGFP-mODC","yeGFP-CLN2","yeGFP"))) %>%
group_by(degron, dm.level) %>%
summarise(n = NROW(exp.mat.ratio),
exp.mat.ratio = min(exp.mat.ratio)-2)
`summarise()` has grouped output by 'degron'. You can override using the `.groups` argument.

Added the protein inhibiition data set
figs2.prtIn <- dy.pup1 %>%
left_join(.,pup1.proInhi.attr %>%
filter(red == "pup1-rfp"),
by = c("cell.id","treatment","degron","red","colony","exp.field")) %>%
mutate(dapi.mean.bg.sub.puncta = ifelse(is.na(dapi.mean.bg.sub.puncta), 0, dapi.mean.bg.sub.puncta) ,
rfp.mean.bg.sub.puncta = ifelse(is.na(rfp.mean.bg.sub.puncta), 0 , rfp.mean.bg.sub.puncta)) %>%
filter(rfp.mean.bg.sub.puncta > 0)
#with proteasome inhibition ##percent cells with mu < 1
figs2.prtIn %>%
filter(rfp.mean.bg.sub.puncta > 0,
treatment != "none") %>%
filter(model == "dy.dm") %>%
filter(ifelse(treatment == "5uM", dy > 0.005, dy < 0.5),
dm > 0.00001) %>%
mutate(dm.level = ifelse(dm > 1, "high", "low"),
degron = case_when(degron %in% c("mODC","mODC.2") ~ "GFP-mODC",
degron %in% c("cln2.2","cln2","cln2.3","cln2.4") ~ "GFP-CLN2",
degron %in% c("stable","stable.2","stable.3") ~ "GFP"),
treatment = factor(treatment, levels = c("dmso1","dmso2","1uM","2.5uM","5uM","50uM"))) %>%
group_by(treatment, dm.level) %>%
tally() %>%
pivot_wider(values_from = n, names_from = dm.level) %>%
mutate(per.low = (low/(low+high))*100 ) %>%
ggplot(.,aes(x = treatment, y = per.low))+
geom_col(width = 0.2)+
theme_pubr()+
ylab(bquote(atop("% of cells with" , "rate of maturation \u03bc < 1"~ min^{-1})))+
# ylab(TeX("% of cells with rate of maturation $(\\mu) < 1\\ min^{-1}$"))+
theme(text = element_text(size = 8),
legend.position = c(0.5, 1),
legend.direction = "horizontal",
legend.background = element_blank(),
legend.key.size = unit(2 ,"mm"),
axis.line = element_line(size = 0.1),
axis.ticks = element_line(size = 0.2),
axis.title.x = element_blank())+
scale_x_discrete(labels = function(x) str_wrap(x, width = 3))

log(2)/0.5000000
[1] 1.386294
##AIC scores
figs2.prtIn %>%
filter(rfp.mean.bg.sub.puncta > 0,
treatment != "none") %>%
filter(model %in% c("dy.dm","exponential")) %>%
group_by(cell.id) %>%
filter(!(is.na(dy)),
ifelse(degron == "5uM", dy > 0.005000000, dy < 0.5)) %>%
dplyr::select(cell.id, treatment, dm,dy,aic, model, colony) %>%
ungroup() %>%
pivot_wider(values_from = c("dy","aic","dm"), names_from = "model") %>%
mutate(dm_dy.dm = ifelse(is.na(dm_dy.dm), Inf, dm_dy.dm),
dm.level = ifelse(dm_dy.dm > 1, "high", "low")) %>%
mutate( treatment = case_when(treatment %in% c("dmso1","dmso2") ~ "DMSO",
TRUE ~ treatment),
treatment = factor(treatment, levels = c("DMSO","1uM","2.5uM","5uM","50uM"))) %>%
ggplot(.,aes(y = aic_exponential, x = aic_dy.dm))+
# geom_hex(bins = 100)+
ggpointdensity::geom_pointdensity(size = 0.2, adjust = 0.5)+
geom_abline(slope = 1, color = "red4", alpha = 0.5)+
facet_wrap(~treatment, scales = "free")+
theme_pubr()+
ylab(TeX("Exponential model ($\\delta_{exp}$)"))+
xlab(TeX("2-parameter model w Maturation ($\\delta_{mat}$)"))+
labs(title = "Rate of Decay")+
xlim(-350,-100)+
ylim(-350,-100)+
theme(text = element_text(size = 12),#changed to 12 for GRC from 8
axis.text.x = element_text(angle = 30),
axis.line = element_line(size = 0.1),
axis.ticks = element_line(size = 0.2),
strip.background = element_blank(),
legend.key.size = unit(1.5,"mm"),
legend.position = c(0.95,0.2),
legend.background = element_blank(),
legend.direction = "vertical",
legend.title = element_blank())
Warning: Removed 1257 rows containing non-finite values (stat_pointdensity).

##dy scatter plot with PI
figs2.prtIn %>%
filter(rfp.mean.bg.sub.puncta > 0,
treatment != "none") %>%
filter(model %in% c("dy.dm","exponential")) %>%
group_by(cell.id) %>%
filter(!(is.na(dy)),
ifelse(degron == "5uM", dy > 0.005000000, dy < 0.5)) %>%
dplyr::select(cell.id, treatment, dm,dy,aic, model, colony) %>%
ungroup() %>%
pivot_wider(values_from = c("dy","aic","dm"), names_from = "model") %>%
mutate(dm_dy.dm = ifelse(is.na(dm_dy.dm), Inf, dm_dy.dm),
dm.level = ifelse(dm_dy.dm > 1, "high", "low")) %>%
mutate( treatment = case_when(treatment %in% c("dmso1","dmso2") ~ "DMSO",
TRUE ~ treatment),
treatment = factor(treatment, levels = c("DMSO","1uM","2.5uM","5uM","50uM"))) %>%
ggplot(.,aes(y = dy_exponential, x = dy_dy.dm))+
# geom_hex(bins = 100)+
ggpointdensity::geom_pointdensity(size = 0.2, adjust = 0.5)+
geom_abline(slope = 1, color = "red4", alpha = 0.5)+
facet_wrap(~treatment, scales = "free")+
theme_pubr()+
ylab(TeX("Exponential model ($\\delta_{exp}$)"))+
xlab(TeX("2-parameter model w Maturation ($\\delta_{mat}$)"))+
labs(title = "Rate of Decay")+
theme(text = element_text(size = 12),#changed to 12 for GRC from 8
axis.text.x = element_text(angle = 30),
axis.line = element_line(size = 0.1),
axis.ticks = element_line(size = 0.2),
strip.background = element_blank(),
legend.key.size = unit(1.5,"mm"),
legend.position = c(0.95,0.2),
legend.background = element_blank(),
legend.direction = "vertical",
legend.title = element_blank())
Warning: Removed 1256 rows containing non-finite values (stat_pointdensity).

models with least AIC scores
least.aic.plt <- figS2.df %>%
filter(rfp.mean.bg.sub.puncta > 0) %>%
filter(model %in% c("dy.dm","exponential")) %>%
filter(degron %in% c("mODC","mODC.2","cln2","cln2.3","cln2.2","stable.2","stable"), treatment == "none", red == "pup1-rfp") %>%
group_by(cell.id) %>%
filter(aic == min(aic)) %>%
ungroup() %>%
# pivot_wider(names_from = name, values_from = value) %>%
group_by(degron, colony,model) %>%
tally() %>%
mutate(perc = (n/sum(n))*100) %>%
ungroup() %>%
mutate(degron = case_when(degron %in% c("mODC","mODC.2") ~ "GFP-mODC",
degron %in% c("cln2.2","cln2","cln2.3") ~ "GFP-CLN2",
degron %in% c("stable","stable.2") ~ "GFP"),
degron = factor(degron, levels = c("GFP-mODC","GFP-CLN2","GFP"))) %>%
mutate(model = case_when(model == "dy.dm" ~ "Eq 6",
model == "exponential" ~ "Eq 8")) %>%
ggplot(.,aes(x = model, y= perc, color = colony))+
geom_jitter(width = 0.2, height = 0)+
stat_summary(fun.y = mean, fun.ymin = mean, fun.ymax = mean,
geom = "crossbar", width = 0.5)+
facet_wrap(~degron, scales = "free_y", ncol = 3)+
theme_pubr()+
theme(text = element_text(size = 8),
legend.position = "bottom",
legend.direction = "horizontal",
legend.background = element_blank(),
legend.key.size = unit(4 ,"mm"))
least.aic.plt
#patchwork
figs2.final
Warning: Removed 1492 rows containing non-finite values (stat_pointdensity).
Warning: Removed 1491 rows containing non-finite values (stat_pointdensity).

ggsave(plot = figs2.final, path = "~/plots/paper1/figures/fig_1/supplemental_figs/fig_s2/", filename = "aic_dy_unest.pdf", width = 8, height = 6 )
Warning: Removed 1492 rows containing non-finite values (stat_pointdensity).
Warning: Removed 1491 rows containing non-finite values (stat_pointdensity).
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
font metrics unknown for Unicode character U+03bc
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <ce>
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
conversion failure on 'rate of maturation μ < 1' in 'mbcsToSbcs': dot substituted for <bc>
ggsave(plot = figs2.final, path = "~/plots/paper1/figures/fig_1/supplemental_figs/fig_s2/", filename = "aic_dy_unest.png", width = 8, height = 6 )
Warning: Removed 1492 rows containing non-finite values (stat_pointdensity).
Warning: Removed 1491 rows containing non-finite values (stat_pointdensity).
#saving individual plots
ggsave(plot = aic.score.ptDenPlt, path = "~/plots/paper1/figures/fig_1/supplemental_figs/fig_s2/GRC/", filename = "aic_scatterPlt.pdf", width = 6, height = 3 )
Warning: Removed 1492 rows containing non-finite values (stat_pointdensity).
#looking at non-exponential decay add the timelapse data
all.exp.list <- read_csv("~/plots/all_data/all_exp_data.csv")
with protein inhibition
all.exp.list %>%
filter(treatment != "none") %>%
filter(cell.id %in% unique(aic.df$cell.id)) %>%
left_join(.,aic.df %>%
filter(model == "dy.dm") %>%
dplyr::select(cell.id, dm,dy, model,colony),
by = "cell.id") %>%
group_by(cell.id) %>%
mutate(dm.level = ifelse(dm < 1, "low", "high"),
gfp.int = gfpMeanBgAFsub[1]) %>%
na.omit() %>%
mutate(It_I0 = gfpMeanBgAFsub/gfpMeanBgAFsub[1]) %>%
split(.$treatment) %>%
map(.,function(a){
temp.1 <- a
# filter(cell.id %in% sample(a$cell.id, 5))
slope.df <- a %>%
filter(cell.id %in% temp.1$cell.id) %>%
mutate(slope1 = (log(It_I0[31]) - 0)/((delta.time[31]/60) - 0) )
temp.1 %>%
ggplot(.,aes(x = delta.time/60, y = log(It_I0), group = cell.id, color = cell.id))+
geom_line(alpha = 0.2)+
guides(color = "none") +
geom_abline(data = slope.df , aes(intercept = 0, slope = slope.df$slope1, color = cell.id))+
facet_wrap(~dm.level, scales = "free_x")+
theme_pubr()+
labs(title = a$treatment[1])
})
are the dm values > dy ?


for experiments without protein inhibition
all.exp.list %>%
filter(treatment == "none") %>%
filter(cell.id %in% unique(aic.df$cell.id)) %>%
left_join(.,aic.df %>%
filter(model == "dy.dm") %>%
dplyr::select(cell.id, dm,dy, model,colony),
by = "cell.id") %>%
group_by(cell.id) %>%
mutate(dm.level = ifelse(dm < 1, "low", "high"),
gfp.int = gfpMeanBgAFsub[1]) %>%
na.omit() %>%
mutate(It_I0 = gfpMeanBgAFsub/gfpMeanBgAFsub[1]) %>%
split(.$degron) %>%
map(.,function(a){
temp.1 <- a %>%
filter(cell.id %in% sample(a$cell.id, 5))
slope.df <- a %>%
filter(cell.id %in% temp.1$cell.id) %>%
mutate(slope1 = (log(It_I0[31]) - 0)/((delta.time[31]/60) - 0) )
temp.1 %>%
ggplot(.,aes(x = delta.time/60, y = log(It_I0), group = cell.id, color = cell.id))+
geom_line(alpha = 0.2)+
guides(color = "none")+
geom_abline(data = slope.df , aes(intercept = 0, slope = slope.df$slope1, color = cell.id))+
facet_wrap(~dm.level, scales = "free_x")+
theme_pubr()+
labs(title = a$degron[1])
})
$cln2
$cln2.2
$cln2.3
$cln2.4
$mODC
$mODC.2
$mODC.3
$stable
$stable.2
$stable.3










deviation.exp %>%
filter(degron %in% c("mODC.2","cln2.3","cln2.4","stable.2","stable.3")) %>%
filter(red == "pup1-rfp") %>%
mutate(dm.level = ifelse(dm > 10, "high","low")) %>%
ggplot(.,aes(x = delta.y , fill = dm.level))+
geom_density(aes(y = ..scaled..), alpha = 0.5)+
facet_wrap(~degron, scales = "free")+
geom_vline(xintercept = 0)+
xlim(-0.5,1)
Warning: Removed 68 rows containing non-finite values (stat_density).

deviation.exp %>%
filter(red == "pup1-rfp") %>%
split(.$degron) %>%
map(.,function(a){
a <- a %>%
ungroup() %>%
dplyr::select(delta.y, gfp.mean.bg.af.sub.new, rfp.mean.bg.sub.puncta, area, dapi.sum.bg.sub.puncta) %>%
na.omit()
pcor(a)
})
deviation.exp %>%
filter(red == "pup1-rfp") %>%
filter(degron %in% c("mODC.2","cln2.3","cln2.4","stable.2","stable.3")) %>%
mutate(degron= case_when(degron == "mODC.2" ~ "yeGFP-mODC",
degron %in% c("cln2.3","cln2.4") ~ "yeGFP-CLN2",
degron %in% c("stable.2" ,"stable.3") ~ "yeGFP"),
degron = factor(degron, levels = c("yeGFP-mODC","yeGFP-CLN2","yeGFP"))) %>%
ggplot(.,aes(y = delta.y , x = gfp.mean.bg.af.sub.new))+
ggpointdensity::geom_pointdensity(size = 0.2)+
geom_smooth(method = "lm")+
stat_cor()+
geom_hline(yintercept = 0)+
facet_wrap(~degron, scales = "free_x")
`geom_smooth()` using formula 'y ~ x'

all.exp.list %>%
filter(treatment == "none") %>%
filter(cell.id %in% unique(aic.df$cell.id)) %>%
left_join(.,aic.df %>%
filter(model %in% c("dy.dm", "exponential")) %>%
dplyr::select(cell.id, dm,dy, model,colony),
by = "cell.id") %>%
group_by(cell.id) %>%
mutate(dm = ifelse(is.na(dm), Inf, dm),
dm.level = ifelse(dm < 1, "low", "high"),
gfp.int = gfpMeanBgAFsub[1]) %>%
na.omit() %>%
mutate(It_I0 = gfpMeanBgAFsub/gfpMeanBgAFsub[1]) %>%
dplyr::select(cell.id, red,model, dy, delta.time,gfpMeanBgAFsub, degron, colony, gfp.int, It_I0, image.no) %>%
# filter(image.no == 10) %>%
pivot_wider(values_from = dy, names_from = model) %>%
mutate(new.It_I0 = -exponential*delta.time/60,
ln.It_I0 = log(It_I0),
delta.y = ln.It_I0 - new.It_I0) %>%
filter(degron %in% c("mODC.2","cln2.3","cln2.4","stable.2","stable.3")) %>%
filter(red == "pup1-rfp") %>%
# mutate(dm.level = ifelse(dm > 10, "high","low")) %>%
ggplot(.,aes(x = delta.y, y = factor(image.no, levels = c(31:2)) ,fill = degron))+
stat_density_ridges(geom = "density_ridges_gradient" ,
quantiles = 2,
quantile_lines = TRUE ,
aes(height = ..ndensity..),
rel_min_height = 0.01,
size = 0.1)+
geom_vline(xintercept = 0, size = 0.5)+
xlim(-1,1)
Picking joint bandwidth of 0.0202
Warning: Removed 25592 rows containing non-finite values (stat_density_ridges).

all.exp.list %>%
# filter(treatment != "none") %>%
filter(cell.id %in% unique(aic.df$cell.id)) %>%
left_join(.,aic.df %>%
filter(model %in% c("dy.dm", "exponential")) %>%
dplyr::select(cell.id, dm,dy, model,colony),
by = "cell.id") %>%
group_by(cell.id) %>%
mutate(dm = ifelse(is.na(dm), Inf, dm),
dm.level = ifelse(dm < 1, "low", "high"),
gfp.int = gfpMeanBgAFsub[1]) %>%
na.omit() %>%
mutate(It_I0 = gfpMeanBgAFsub/gfpMeanBgAFsub[1]) %>%
dplyr::select(cell.id,treatment,model, dy, delta.time,gfpMeanBgAFsub, degron, colony, gfp.int, It_I0, image.no) %>%
filter(image.no == 15) %>%
pivot_wider(values_from = dy, names_from = model) %>%
mutate(new.It_I0 = -exponential*delta.time/60,
ln.It_I0 = log(It_I0),
delta.y = ln.It_I0 - new.It_I0) %>%
dplyr::select(delta.y, cell.id) %>%
left_join(.,protInhi.attr, by = "cell.id") %>%
filter(treatment != "none") %>%
filter(treatment %in% c("dmso1","50uM")) %>%
# mutate(dm.level = ifelse(dm > 10, "high","low")) %>%
ggplot(.,aes(x = delta.y , fill = treatment))+
geom_density(aes(y = ..scaled..), alpha = 0.5)+
geom_vline(xintercept = 0)+
scale_x_continuous(breaks = seq(-0.5, 0.5, by = 0.1))+
xlim(-0.5,0.5)
Scale for 'x' is already present. Adding another scale for 'x', which will replace the existing scale.
Warning: Removed 116 rows containing non-finite values (stat_density).

all.exp.list %>%
# filter(treatment != "none") %>%
filter(cell.id %in% unique(aic.df$cell.id)) %>%
left_join(.,aic.df %>%
filter(model %in% c("dy.dm", "exponential")) %>%
dplyr::select(cell.id, dm,dy, model,colony),
by = "cell.id") %>%
group_by(cell.id) %>%
mutate(dm = ifelse(is.na(dm), Inf, dm),
dm.level = ifelse(dm < 1, "low", "high"),
gfp.int = gfpMeanBgAFsub[1]) %>%
na.omit() %>%
mutate(It_I0 = gfpMeanBgAFsub/gfpMeanBgAFsub[1]) %>%
dplyr::select(cell.id,treatment,model, dy, delta.time,gfpMeanBgAFsub, degron, colony, gfp.int, It_I0, image.no) %>%
# filter(image.no == 15) %>%
pivot_wider(values_from = dy, names_from = model) %>%
mutate(new.It_I0 = -exponential*delta.time/60,
ln.It_I0 = log(It_I0),
delta.y = ln.It_I0 - new.It_I0) %>%
dplyr::select(delta.y, cell.id, image.no) %>%
left_join(.,protInhi.attr, by = c("cell.id")) %>%
filter(treatment != "none") %>%
filter(!(treatment %in% c("dmso1","50uM"))) %>%
# mutate(dm.level = ifelse(dm > 10, "high","low")) %>%
ggplot(.,aes(x = delta.y, y = factor(image.no.x, levels = c(31:2)) ,fill = treatment, alpha = 0.2))+
stat_density_ridges(geom = "density_ridges_gradient" ,
quantiles = 2,
quantile_lines = TRUE ,
aes(height = ..ndensity..),
rel_min_height = 0.01,
size = 0.1,
alpha = 0.2)+
facet_wrap(~treatment, scales = "free")+
xlim(-1,1)+
geom_vline(xintercept = 0)
Picking joint bandwidth of 0.0311
Picking joint bandwidth of 0.0236
Picking joint bandwidth of 0.0159
Picking joint bandwidth of 0.0431
Warning: Removed 11680 rows containing non-finite values (stat_density_ridges).

LS0tCnRpdGxlOiAicGFwZXIxX2ZpZ3VyZXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQpsaWJyYXJ5KGxhdGV4MmV4cCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2dwdWJyKQpsaWJyYXJ5KHBhdGNod29yaykKYGBgCiNsb2FkIHRoZSBkYXRhCiMjI0FJQyB2YWx1ZXMgb2YgdGhlIDQgc2NlbmFyaW9zIGFsb25nIHdpdGggdGhlIHBhcmFtZXRlcnMgZXN0aW1hdGVkIApgYGB7cn0KYWljLmRmIDwtIHJlYWRfY3N2KCJ+L3Bsb3RzL2FsbF9kYXRhL2FpYy5jc3YiKQpgYGAKCiMjI2FkZCB0aGUgcmVwbGljYXRlIGluZm8gCmBgYHtyfQoKYWljLmRmIDwtIGFpYy5kZiAlPiUgCiAgbXV0YXRlKGV4cC5maWVsZCA9IHBhc3RlMChzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWywyXSwiXyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfc3BsaXQoY2VsbC5pZCwgIl8iLCBzaW1wbGlmeSA9IFQpWywzXSksCiAgICBjb2xvbnkgPSBjYXNlX3doZW4oZXhwLmZpZWxkICVpbiUgYygiMjBtaW5fczMiLCAiMjBtaW5fczQiKSB+ICJSZXBsaWNhdGUgMSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwLmZpZWxkICVpbiUgYygiMjBtaW5fczUiLCAiMjBtaW5fczYiKSB+ICJSZXBsaWNhdGUgMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHAuZmllbGQgJWluJSBjKCIyMG1pbl9zNyIsICIyMG1pbl9zOCIgLCAiMjBtaW5fczkiKSB+ICJSZXBsaWNhdGUgMyIpKQoKYWljLmRmIDwtIGFpYy5kZiAlPiUgCiAgbXV0YXRlKGNvbG9ueSA9IGlmZWxzZShkZWdyb24gPT0gInN0YWJsZSIgJiByZWQgPT0gInB1cDEtcmZwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlX3doZW4oZXhwLmZpZWxkICVpbiUgYygiMjBtaW5fczQiLCAiMjBtaW5fczUiKSB+ICJSZXBsaWNhdGUgMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwLmZpZWxkICVpbiUgYygiMjBtaW5fczYiLCAiMjBtaW5fczciKSB+ICJSZXBsaWNhdGUgMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwLmZpZWxkICVpbiUgYygiMjBtaW5fczgiLCAiMjBtaW5fczkiKSB+ICJSZXBsaWNhdGUgMyIpLCBjb2xvbnkpKSAKICAKYGBgCgojIyNDZWxsdWxhciBhdHRyaWJ1dGVzCmBgYHtyfQpwdXAxLmNlbGwuYXR0ciA8LSByZWFkX2Nzdigifi9wbG90cy9hbGxfZGF0YS9hbGxfcHVwMV9jZWxsX2F0dHIuY3N2IikKYGBgCgojcHVwMS1SRlAgYmFja2dyb3VuZApgYGB7cn0KcHVwMS5jZWxsLmF0dHIgPC0gcHVwMS5jZWxsLmF0dHIgJT4lIAogIG11dGF0ZShleHAuZmllbGQgPSBwYXN0ZTAoc3RyX3NwbGl0KGNlbGwuaWQsICJfIiwgc2ltcGxpZnkgPSBUKVssMl0sIl8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3NwbGl0KGNlbGwuaWQsICJfIiwgc2ltcGxpZnkgPSBUKVssM10pLAogICAgY29sb255ID0gY2FzZV93aGVuKGV4cC5maWVsZCAlaW4lIGMoIjIwbWluX3MzIiwgIjIwbWluX3M0IikgfiAiUmVwbGljYXRlIDEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cC5maWVsZCAlaW4lIGMoIjIwbWluX3M1IiwgIjIwbWluX3M2IikgfiAiUmVwbGljYXRlIDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwLmZpZWxkICVpbiUgYygiMjBtaW5fczciLCAiMjBtaW5fczgiICwgIjIwbWluX3M5IikgfiAiUmVwbGljYXRlIDMiKSkKCnB1cDEuY2VsbC5hdHRyIDwtIHB1cDEuY2VsbC5hdHRyICU+JSAKICBtdXRhdGUoY29sb255ID0gaWZlbHNlKGRlZ3JvbiA9PSAic3RhYmxlIiAmIHJlZCA9PSAicHVwMS1yZnAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Vfd2hlbihleHAuZmllbGQgJWluJSBjKCIyMG1pbl9zNCIsICIyMG1pbl9zNSIpIH4gIlJlcGxpY2F0ZSAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHAuZmllbGQgJWluJSBjKCIyMG1pbl9zNiIsICIyMG1pbl9zNyIpIH4gIlJlcGxpY2F0ZSAyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHAuZmllbGQgJWluJSBjKCIyMG1pbl9zOCIsICIyMG1pbl9zOSIpIH4gIlJlcGxpY2F0ZSAzIiksIGNvbG9ueSkpIAogCm11bHRpcGxlLnB1cDEgPC0gcHVwMS5jZWxsLmF0dHIgJT4lIAogIG11dGF0ZShkYXBpLm1lYW4uYmcuc3ViLnB1bmN0YSA9IGlmZWxzZShpcy5uYShkYXBpLm1lYW4uYmcuc3ViLnB1bmN0YSksIDAsIGRhcGkubWVhbi5iZy5zdWIucHVuY3RhKSAsIAogICAgICAgICByZnAubWVhbi5iZy5zdWIucHVuY3RhID0gaWZlbHNlKGlzLm5hKHJmcC5tZWFuLmJnLnN1Yi5wdW5jdGEpLCAwICwgcmZwLm1lYW4uYmcuc3ViLnB1bmN0YSkpICU+JSAKICBmaWx0ZXIocmZwLm1lYW4uYmcuc3ViLnB1bmN0YSA+IDApICU+JSAKICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgdGFsbHkoKSAlPiUgCiAgZmlsdGVyKG4+MSkKCnB1cDEuY2VsbC5hdHRyIDwtICBwdXAxLmNlbGwuYXR0ciAlPiUgCiAgZ3JvdXBfYnkoY2VsbC5pZCkgJT4lIAogIG11dGF0ZShyZnAubWVhbi5iZy5zdWIucHVuY3RhID0gaWZlbHNlKGNlbGwuaWQgJWluJSBtdWx0aXBsZS5wdXAxJGNlbGwuaWQgLCBtZWFuKHJmcC5tZWFuLmJnLnN1Yi5wdW5jdGEpLCByZnAubWVhbi5iZy5zdWIucHVuY3RhICkpICU+JSAKICAgIGRpc3RpbmN0KGNlbGwuaWQsIC5rZWVwX2FsbCA9IFRSVUUpIApgYGAKCiMjI051bWJlciBvZiBkYXRhIHBvaW50cyBmb3IgZWFjaCBjZWxsCmBgYHtyfQpuby5vZi5kcCA8LSByZWFkX2Nzdigifi9wbG90cy9hbGxfZGF0YS9hbGxfZXhwX2RhdGEuY3N2IikgJT4lIAogIGZpbHRlcihjZWxsLmlkICVpbiUgZmlnUzIuZGYkY2VsbC5pZCkgJT4lIAogIGdyb3VwX2J5KGNlbGwuaWQpICU+JSAKdGFsbHkoKQoKbm8ub2YuZHAgJT4lIGZpbHRlcihuID4gMzEpCmBgYAoKI2R5IGVzdGltYXRlZCB1c2luZyB0aGUgMS1wYXJhbWV0ZXIgZXhwb25lbnRpYWwgYW5kIDItcGFyYW1ldGVyIHdpdGggbWF0dXJhdGlvbiBtb2RlbApXZSBuZWVkIGJvdGggdGhlIG1vZGVscyBiZWNhdXNlIHdlIGFyZSBjb21wYXJpbmcgdGhlIHJhdGUgb2YgZGVjYXkgZnJvbSBib3RoIHRoZSBtb2RlbHMKYGBge3J9CmR5LnB1cDEgPC0gYWljLmRmICU+JSAKICBmaWx0ZXIocmVkID09ICJwdXAxLXJmcCIpICU+JSAKICBmaWx0ZXIoaWZlbHNlKGRlZ3JvbiAlaW4lIGMoInN0YWJsZS4yIiwic3RhYmxlIiwic3RhYmUuMyIpLCBkeSA8IDAuMSwgZHkgPCAwLjUpKSAlPiUgCiAgZ3JvdXBfYnkoY2VsbC5pZCkgJT4lIAogIG11dGF0ZShkbSA9IGlmZWxzZShpcy5uYShkbSksIEluZiwgZG0pKSAlPiUKICBmaWx0ZXIoIGRtID4gMC4wMDAwMSkgJT4lIAogIGZpbHRlcihtb2RlbCAlaW4lIGMoImR5LmRtIiwiZXhwb25lbnRpYWwiKSkKICAKYGBgCgojbnVtYmVyIG9mIGNlbGxzIHRoYXQgY29udmVyZ2VkIGluIGJvdGggdGhlIG1vZGVscwpgYGB7cn0KZHkucHVwMSAlPiUgCiAgZmlsdGVyKGRlZ3JvbiAlaW4lIGMoIm1PREMuMiIsImNsbjIuMyIsImNsbjIuNCIsInN0YWJsZS4yIiwic3RhYmxlLjMiKSkgJT4lIAogIHNlbGVjdChjZWxsLmlkLCBtb2RlbCwgZHksIGFpYyxkZWdyb24pICU+JSAKICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IGMoImR5IiwiYWljIiksIG5hbWVzX2Zyb20gPSBtb2RlbCkgJT4lIAogIG5hLm9taXQoKSAlPiUgCiAgZ3JvdXBfYnkoZGVncm9uKSAlPiUgCiAgdGFsbHkoKQoKYGBgCgpGaW5hbCBkZiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBmaWd1cmVzCmBgYHtyfQpmaWdTMi5kZiA8LSBkeS5wdXAxICU+JSAKICBmaWx0ZXIodHJlYXRtZW50ID09ICJub25lIikgJT4lIAogIGxlZnRfam9pbiguLHB1cDEuY2VsbC5hdHRyICU+JQogICAgICAgICAgICAgIGZpbHRlcihyZWQgPT0gInB1cDEtcmZwIiwgdHJlYXRtZW50ID09ICJub25lIiksCiAgICAgICAgICAgIGJ5ID0gYygiY2VsbC5pZCIsInRyZWF0bWVudCIsImRlZ3JvbiIsInJlZCIsImNvbG9ueSIsImV4cC5maWVsZCIpKSAlPiUgCiAgbXV0YXRlKGRhcGkubWVhbi5iZy5zdWIucHVuY3RhID0gaWZlbHNlKGlzLm5hKGRhcGkubWVhbi5iZy5zdWIucHVuY3RhKSwgMCwgZGFwaS5tZWFuLmJnLnN1Yi5wdW5jdGEpICwgCiAgICAgICAgIHJmcC5tZWFuLmJnLnN1Yi5wdW5jdGEgPSBpZmVsc2UoaXMubmEocmZwLm1lYW4uYmcuc3ViLnB1bmN0YSksIDAgLCByZnAubWVhbi5iZy5zdWIucHVuY3RhKSkgJT4lIAogIGZpbHRlcihyZnAubWVhbi5iZy5zdWIucHVuY3RhID4gMCkgJT4lIAogIGZpbHRlcihpZmVsc2UoZGVncm9uICVpbiUgYygic3RhYmxlLjMiLCJzdGFibGUuMiIpLCBkeSA8IDAuMSwgZHkgPCAwLjUpKQoKYGBgCgpMb29raW5nIGF0IGhvdyBtYW55IGNlbGxzIGNvbnZlcmdlZCBpbiB0aGUgbWF0IG1vZGVsIGFuZCBpbiBleHBvbmVudGlhbCBtb2RlbApgYGB7cn0KI3RvdGFsIG5vLiBvZiBjZWxscyB3aGljaCBjb252ZXJnZWQgaW4gdGhlIHRoZSBtYXR1cmF0aW9uICsgZGVjYXkgbW9kZWwgYnV0IG5vdCBpbiB0aGUgZXhwb25lbnRpYWwgbW9kZWwKZmlnUzIuZGYgJT4lIAogIGRwbHlyOjpzZWxlY3QoY2VsbC5pZCwgZHksIG1vZGVsLCBkZWdyb24pICU+JSAKICBkcGx5cjo6dW5ncm91cCgpICU+JSAKICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IGR5LCBuYW1lc19mcm9tID0gbW9kZWwpICU+JSAKICBmaWx0ZXIoaXMubmEoZXhwb25lbnRpYWwpKSAlPiUgCiAgZ3JvdXBfYnkoZGVncm9uKSAlPiUgCiAgdGFsbHkoKQoKI3RvdGFsIG5vLiBvZiBjZWxscyB3aGljaCBjb252ZXJnZWQgaW4gdGhlIGV4cG9uZW50aWFsIG1vZGVsIGJ1dCBub3QgaW4gdGhlIG1hdHVyYXRpb24gKyBkZWNheSBtb2RlbApmaWdTMi5kZiAlPiUgCiAgZHBseXI6OnNlbGVjdChjZWxsLmlkLCBkeSwgbW9kZWwsIGRlZ3JvbikgJT4lIAogIGRwbHlyOjp1bmdyb3VwKCkgJT4lIAogIHBpdm90X3dpZGVyKHZhbHVlc19mcm9tID0gZHksIG5hbWVzX2Zyb20gPSBtb2RlbCkgJT4lIAogIGZpbHRlcihpcy5uYShkeS5kbSkpICU+JSAKICBncm91cF9ieShkZWdyb24pICU+JSAKICB0YWxseSgpCmBgYAoKI3BlcmNlbnQgb2YgY2VsbHMgd2l0aCBsb3dlc3QgQUlDIHNjb3JlcyBpbiBlYWNoIG1vZGVsCmBgYHtyfQpmaWdTMi5kZiAlPiUgCiAgZmlsdGVyKGRlZ3JvbiAlaW4lIGMoIm1PREMuMiIsImNsbjIuMyIsImNsbjIuNCIsInN0YWJsZS4yIiwic3RhYmxlLjMiKSkgJT4lIAogIG11dGF0ZShkZWdyb24gPSBjYXNlX3doZW4oZGVncm9uICVpbiUgYygibU9EQyIsIm1PREMuMiIpIH4gIkdGUC1tT0RDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JvbiAlaW4lIGMoImNsbjIuMiIsImNsbjIiLCJjbG4yLjMiLCJjbG4yLjQiKSB+ICJHRlAtQ0xOMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyb24gJWluJSBjKCJzdGFibGUiLCJzdGFibGUuMiIsInN0YWJsZS4zIikgfiAiR0ZQIikpICU+JQogIHNlbGVjdChjZWxsLmlkLCBtb2RlbCwgZHksIGFpYyxkZWdyb24pICU+JSAKICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IGMoImR5IiwiYWljIiksIG5hbWVzX2Zyb20gPSBtb2RlbCkgJT4lIAogIG5hLm9taXQoKSAlPiUgCiAgbXV0YXRlKGJlc3QubW9kZWwgPSBpZmVsc2UoYWljX2V4cG9uZW50aWFsIDwgYWljX2R5LmRtLCAiZXhwIiwibWF0IikpICU+JSAKICBncm91cF9ieShkZWdyb24sYmVzdC5tb2RlbCkgJT4lIAogIHRhbGx5KCkgJT4lIAogIG11dGF0ZShwZXIubW9kID0gcm91bmQoKG4vc3VtKG4pKSoxMDAgLGRpZ2l0cyA9IDIpKSAKYGBgCgojdW5kZXJlc3RpbWF0aW9uIG9mIGRlY2F5IHJhdGVzIGJ5IGV4cG9uZW50aWFsIG1vZGVsIGdyb3VwZWQgYnkgCmBgYHtyfQpmaWdTMi5kZiAlPiUgCiAgZHBseXI6OnNlbGVjdChjZWxsLmlkLCBkbSwgZHksIG1vZGVsLCBkZWdyb24sIGdmcC5tZWFuLmJnLmFmLnN1Yi5uZXcpICU+JSAKICBkcGx5cjo6dW5ncm91cCgpICU+JSAKICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IGMoImR5IiwiZG0iKSwgbmFtZXNfZnJvbSA9IG1vZGVsKSAlPiUgCiAgbXV0YXRlKGRtLmxldmVsID0gaWZlbHNlKGRtX2R5LmRtID4gMSwgIj4xIiwgIjwxIiksCiAgICBleHAubWF0LnJhdGlvID0gKChkeV9keS5kbSAtIGR5X2V4cG9uZW50aWFsKS9keV9keS5kbSkqMTAwKSAlPiUgCiAgZmlsdGVyKCEoaXMubmEoZXhwLm1hdC5yYXRpbykpKSU+JQogIGZpbHRlcihkZWdyb24gJWluJSBjKCJtT0RDLjIiLCJjbG4yLjMiLCJzdGFibGUuMyIsInN0YWJsZS4yIiwiY2xuMi40IikpICU+JSAKICBtdXRhdGUoZGVncm9uID0gY2FzZV93aGVuKGRlZ3JvbiAlaW4lIGMoImNsbjIuMyIsImNsbjIuNCIpIH4gIkdGUC1DTE4yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JvbiAlaW4lIGMoIm1PREMuMiIpIH4gIkdGUC1tT0RDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JvbiAlaW4lIGMoInN0YWJsZS4yIiwic3RhYmxlLjMiKSB+ICJHRlAiKSwKICAgICAgICAgZGVncm9uID0gZmFjdG9yKGRlZ3JvbiwgbGV2ZWxzID0gYygiR0ZQLW1PREMiLCJHRlAtQ0xOMiIsIkdGUCIpKSkgJT4lCiAgZ3JvdXBfYnkoZGVncm9uLCBkbS5sZXZlbCkgJT4lIAogIHN1bW1hcmlzZShtZWRpYW4oZXhwLm1hdC5yYXRpbykgJT4lIHNpZ25pZiguLGRpZ2l0cyA9IDIpLCAKICAgICAgICAgICAgc2QoZXhwLm1hdC5yYXRpbyksCiAgICAgICAgICAgIE5ST1coZXhwLm1hdC5yYXRpbykpCmBgYAoKCmBgYHtyfQpmaWdTMi5kZiAlPiUgCiAgZHBseXI6OnNlbGVjdChjZWxsLmlkLCBkeSwgbW9kZWwsIGRlZ3JvbiwgZ2ZwLm1lYW4uYmcuYWYuc3ViLm5ldykgJT4lIAogIGRwbHlyOjp1bmdyb3VwKCkgJT4lIAogIHBpdm90X3dpZGVyKHZhbHVlc19mcm9tID0gZHksIG5hbWVzX2Zyb20gPSBtb2RlbCkgJT4lIAogIG11dGF0ZShleHAubWF0LnJhdGlvID0gKGR5LmRtIC0gZXhwb25lbnRpYWwpL2R5LmRtKSAlPiUgCiAgZmlsdGVyKCEoaXMubmEoZXhwLm1hdC5yYXRpbykpKSAlPiUKICBmaWx0ZXIoZGVncm9uICVpbiUgYygibU9EQy4yIiwiY2xuMi4zIiwiY2xuMi40Iiwic3RhYmxlLjMiLCJzdGFibGUuMiIpKSAlPiUgCiAgbXV0YXRlKGRlZ3JvbiA9IGNhc2Vfd2hlbihkZWdyb24gJWluJSBjKCJjbG4yLjMiLCJjbG4yLjQiKSB+ICJHRlAtQ0xOMiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVncm9uICVpbiUgYygibU9EQy4yIikgfiAiR0ZQLW1PREMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JvbiAlaW4lIGMoInN0YWJsZS4yIiwic3RhYmxlLjMiKSB+ICJHRlAiKSwgCiAgICAgICAgIGRlZ3JvbiA9IGZhY3RvcihkZWdyb24sIGxldmVscyA9IGMoIkdGUC1tT0RDIiwiR0ZQLUNMTjIiLCJHRlAiKSkpICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGdmcC5tZWFuLmJnLmFmLnN1Yi5uZXcsIHkgPSBleHAubWF0LnJhdGlvKSkrCiAgZ2VvbV9wb2ludChzaXplID0gMC4yKSsKICBmYWNldF93cmFwKH5kZWdyb24sIHNjYWxlcyA9ICJmcmVlIikrCiAgdGhlbWVfcHVicigpCgoKYGBgCgojYmFyIHBsb3QgdG8gc2hvdyB3aGljaCBtb2RlbCBiZXN0IGV4cGxhaW5zIHRoZSBkZWNheSAKYGBge3J9CmZpZ1MyLmRmICU+JSAKICBmaWx0ZXIobW9kZWwgJWluJSBjKCJkeS5kbSIsImV4cG9uZW50aWFsIikpICU+JSAKICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgZmlsdGVyKGFpYyA9PSBtaW4oYWljKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgIyBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gbmFtZSwgdmFsdWVzX2Zyb20gPSB2YWx1ZSkgJT4lIAogIGdyb3VwX2J5KHRyZWF0bWVudCwgcmVkLCBkZWdyb24sIGNvbG9ueSxtb2RlbCkgJT4lIAogIHRhbGx5KCkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgZmlsdGVyKHRyZWF0bWVudCA9PSAibm9uZSIpICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IG1vZGVsLCB5PSBuLCBmaWxsID0gY29sb255KSkrCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsKICBmYWNldF93cmFwKH5kZWdyb24sIHNjYWxlcyA9ICJmcmVlIikKICAjIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCgphaWMuZGYgJT4lIAogIGZpbHRlcihtb2RlbCAlaW4lIGMoImR5LmRtIiwiZXhwb25lbnRpYWwiKSkgJT4lIAogIGdyb3VwX2J5KGNlbGwuaWQpICU+JSAKICBmaWx0ZXIoYWljID09IG1pbihhaWMpKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICAjIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBuYW1lLCB2YWx1ZXNfZnJvbSA9IHZhbHVlKSAlPiUgCiAgZ3JvdXBfYnkodHJlYXRtZW50LCByZWQsIGRlZ3JvbiwgbW9kZWwpICU+JSAKICB0YWxseSgpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIGZpbHRlcih0cmVhdG1lbnQgIT0gIm5vbmUiKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBtb2RlbCwgeT0gbikpKwogIGdlb21fY29sKCkrCiAgZmFjZXRfd3JhcCh+dHJlYXRtZW50LCBzY2FsZXMgPSAiZnJlZV95IikrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKCgpgYGAKCmBgYHtyfQpoaWdoLmRtIDwtIGZpZ1MyLmRmICU+JSAKICBmaWx0ZXIobW9kZWwgJWluJSBjKCJkeS5kbSIpKSAlPiUgCiAgZmlsdGVyKCB0cmVhdG1lbnQgPT0gIm5vbmUiLCByZWQgPT0gInB1cDEtcmZwIikgJT4lIAogIGZpbHRlcihkbSA+IDEpCgpsb3cuZG0gPC0gZmlnUzIuZGYgJT4lIAogIGZpbHRlcihtb2RlbCAlaW4lIGMoImR5LmRtIikpICU+JSAKICBmaWx0ZXIodHJlYXRtZW50ID09ICJub25lIiwgcmVkID09ICJwdXAxLXJmcCIpICU+JSAKICBmaWx0ZXIoZG0gPCAxKQpgYGAKCiNtb2RpZmllZCBzdXBwbGVtdGFsIGZpZ3VyZXMKI3RoZSB2YWx1ZXMgb2YgZHkgd2hlbiAKYGBge3J9CiNjbG4yCmZpZ1MyLmRmICU+JSAKICBmaWx0ZXIobW9kZWwgJWluJSBjKCJkeS5kbSIsImV4cG9uZW50aWFsIikgKSAlPiUgCiAgZmlsdGVyKGRlZ3JvbiAlaW4lIGMoImNsbjIiLCJjbG4yLjIiLCJjbG4yLjMiLCJjbG4yLjQiKSwgdHJlYXRtZW50ID09ICJub25lIiwgcmVkID09ICJwdXAxLXJmcCIpICU+JSAKICBmaWx0ZXIoZHkgPCAwLjUpICU+JSAKICBtdXRhdGUoZG0ubGV2ZWwgPSBpZmVsc2UoY2VsbC5pZCAlaW4lIGhpZ2guZG0kY2VsbC5pZCAsICJIaWdoIiwgImxvdyIpKSAlPiUgCiAgc2VsZWN0KGNlbGwuaWQsIGRlZ3JvbiwgZHksIG1vZGVsLCBkbS5sZXZlbCkgJT4lIAogIHBpdm90X3dpZGVyKHZhbHVlc19mcm9tID0gZHksIG5hbWVzX2Zyb20gPSBtb2RlbCkgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gZXhwb25lbnRpYWwsIHkgPSBkeS5kbSwgY29sb3IgPSBkbS5sZXZlbCkpKwogICAgZ2VvbV9wb2ludChzaXplID0gMC41KSsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGNvbG9yID0gImZpcmVicmljazEiKSsKICBzdGF0X2NvcigpKwogIHRoZW1lX3B1YnIoKSsKICB4bGFiKFRlWCgiUmF0ZSBvZiBEZWNheSBmcm9tIGEgb25lIHBhcmFtZXRlciBtb2RlbCAoRXEuIDgpLCAkXFxkZWx0YSAsIG1pbl57LTF9JCIpKSsKICB5bGFiKFRlWCgiUmF0ZSBvZiBEZWNheSBmcm9tIGEgbW9kZWwgd2l0aCBtYXR1cmF0aW9uIChFcS4gNiksICRcXGRlbHRhICwgbWluXnstMX0kIikpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpKQoKI3N0YWJsZQpmaWdTMi5kZiAlPiUgCiAgZmlsdGVyKHJmcC5tZWFuLmJnLnN1Yi5wdW5jdGEgPiAwKSAlPiUgCiAgZmlsdGVyKG1vZGVsICVpbiUgYygiZHkuZG0iLCJleHBvbmVudGlhbCIpICkgJT4lIAogIGZpbHRlcihkZWdyb24gJWluJSBjKCJzdGFibGUiLCJzdGFibGUuMiIsInN0YWJsZS4zIiksIHRyZWF0bWVudCA9PSAibm9uZSIsIHJlZCA9PSAicHVwMS1yZnAiKSAlPiUgCiAgZmlsdGVyKGR5IDwgMC4xKSAlPiUgCiAgbXV0YXRlKGRtLmxldmVsID0gaWZlbHNlKGNlbGwuaWQgJWluJSBoaWdoLmRtJGNlbGwuaWQgLCAiSGlnaCIsICJsb3ciKSkgJT4lIAogIHNlbGVjdChjZWxsLmlkLCBkZWdyb24sIGR5LCBtb2RlbCwgZG0ubGV2ZWwpICU+JSAKICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IGR5LCBuYW1lc19mcm9tID0gbW9kZWwpICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGV4cG9uZW50aWFsLCB5ID0gZHkuZG0sIGNvbG9yID0gZG0ubGV2ZWwpKSsKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDAuNSkrCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBjb2xvciA9ICJmaXJlYnJpY2sxIikrCiAgc3RhdF9jb3IoKSsKICB0aGVtZV9wdWJyKCkrCiAgeGxhYihUZVgoIlJhdGUgb2YgRGVjYXkgZnJvbSBhIG9uZSBwYXJhbWV0ZXIgbW9kZWwgKEVxLiA4KSwgJFxcZGVsdGEgLCBtaW5eey0xfSQiKSkrCiAgeWxhYihUZVgoIlJhdGUgb2YgRGVjYXkgZnJvbSBhIG1vZGVsIHdpdGggbWF0dXJhdGlvbiAoRXEuIDYpLCAkXFxkZWx0YSAsIG1pbl57LTF9JCIpKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSkKCiAgCmBgYAoKI2RtIHZhbHVlcyBoaXN0b2dyYW0KYGBge3J9CmRtLmRpc3RQbHQgPC0gZmlnUzIuZGYgJT4lIAogIGZpbHRlcihyZnAubWVhbi5iZy5zdWIucHVuY3RhID4gMCwKICAgICAgICAgZGVncm9uICVpbiUgYygibU9EQy4yIiwiY2xuMi4zIiwic3RhYmxlLjMiKSkgJT4lIAogIGZpbHRlcihtb2RlbCA9PSAiZHkuZG0iKSAlPiUgCiAgZmlsdGVyKHRyZWF0bWVudCA9PSAibm9uZSIsIHJlZCA9PSAicHVwMS1yZnAiKSAlPiUgCiAgZmlsdGVyKGlmZWxzZShkZWdyb24gJWluJSBjKCJzdGFibGUiLCJzdGFibGUuMiIsInN0YWJsZS4zIiksIGR5IDwgMC4xLCBkeSA8IDAuNSksIAogICAgICAgICBkbSA+IDAuMDAwMDEpICU+JSAKICBtdXRhdGUoZGVncm9uID0gY2FzZV93aGVuKGRlZ3JvbiAlaW4lIGMoIm1PREMiLCJtT0RDLjIiKSB+ICJHRlAtbU9EQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyb24gJWluJSBjKCJjbG4yLjIiLCJjbG4yIiwiY2xuMi4zIiwiY2xuMi40IikgfiAiR0ZQLUNMTjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVncm9uICVpbiUgYygic3RhYmxlIiwic3RhYmxlLjIiLCJzdGFibGUuMyIpIH4gIkdGUCIpLCAKICAgICAgICAgZGVncm9uID0gZmFjdG9yKGRlZ3JvbiwgbGV2ZWxzID0gYygiR0ZQLW1PREMiLCJHRlAtQ0xOMiIsIkdGUCIpKSkgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gZG0sIGZpbGwgPSBkZWdyb24pKSsKICBnZW9tX2hpc3RvZ3JhbShwb3NpdGlvbiA9ICJkb2RnZSIpKwogIHRoZW1lX3B1YnIoKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJpbmRpYW5yZWQzIiwia2hha2kzIiwiZGVlcHNreWJsdWUzIiksIG5hbWUgPSBOVUxMKSsKICBzY2FsZV94X2xvZzEwKGxhYmVscyA9IHNjYWxlczo6dHJhbnNfZm9ybWF0KCJsb2cxMCIsIHNjYWxlczo6bWF0aF9mb3JtYXQoMTBeLngpKSkrCiAgeGxhYihUZVgoIlJhdGUgb2YgTWF0dXJhdGlvbiAoJFxcbXUsbWluXnstMX0kKSIpKSsKICB5bGFiKCJOby4gb2YgY2VsbHMiKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwgCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjUsIDEpLCAKICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiLCAKICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgyICwibW0iKSwKICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjEpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuMikpCmRtLmRpc3RQbHQKYGBgCgojcGVyY2VudCBvZiBjZWxscyB3aXRoIGRtIHZhbHVlcyA+IDEgYW5kIDwgMSBpbiB0aGUgbWF0dXJhdGlvbiBtb2RlbApgYGB7cn0KZG0ucGVyLmxvdy5CYXJQbHQgPC0gZmlnUzIuZGYgJT4lIAogIGZpbHRlcihyZnAubWVhbi5iZy5zdWIucHVuY3RhID4gMCwKICAgICAgICAgZGVncm9uICVpbiUgYygibU9EQy4yIiwiY2xuMi40IiwiY2xuMi4zIiwic3RhYmxlLjIiLCJzdGFibGUuMyIpKSAlPiUgCiAgZmlsdGVyKG1vZGVsID09ICJkeS5kbSIpICU+JSAKICBmaWx0ZXIodHJlYXRtZW50ID09ICJub25lIiwgcmVkID09ICJwdXAxLXJmcCIpICU+JSAKICBmaWx0ZXIoaWZlbHNlKGRlZ3JvbiAlaW4lIGMoInN0YWJsZSIsInN0YWJsZS4yIiwic3RhYmxlLjMiKSwgZHkgPCAwLjEsIGR5IDwgMC41KSwgCiAgICAgICAgIGRtID4gMC4wMDAwMSkgJT4lIAogIG11dGF0ZShkbS5sZXZlbCA9IGlmZWxzZShkbSA+IDEsICJoaWdoIiwgImxvdyIpLAogICAgZGVncm9uID0gY2FzZV93aGVuKGRlZ3JvbiAlaW4lIGMoIm1PREMiLCJtT0RDLjIiKSB+ICJ5ZUdGUC1tT0RDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JvbiAlaW4lIGMoImNsbjIuMiIsImNsbjIiLCJjbG4yLjMiLCJjbG4yLjQiKSB+ICJ5ZUdGUC1DTE4yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JvbiAlaW4lIGMoInN0YWJsZSIsInN0YWJsZS4yIiwic3RhYmxlLjMiKSB+ICJ5ZUdGUCIpLCAKICAgICAgICAgZGVncm9uID0gZmFjdG9yKGRlZ3JvbiwgbGV2ZWxzID0gYygieWVHRlAtbU9EQyIsInllR0ZQLUNMTjIiLCJ5ZUdGUCIpKSkgJT4lIAogIGdyb3VwX2J5KGRlZ3JvbiwgZG0ubGV2ZWwpICU+JSAKICB0YWxseSgpICU+JSAKICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IG4sIG5hbWVzX2Zyb20gPSBkbS5sZXZlbCkgJT4lIAogIG11dGF0ZShwZXIubG93ID0gKGxvdy8obG93K2hpZ2gpKSoxMDAgKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBkZWdyb24sIHkgPSBwZXIubG93KSkrCiAgZ2VvbV9jb2wod2lkdGggPSAwLjIpKwogIHRoZW1lX3B1YnIoKSsKICB5bGFiKGJxdW90ZShhdG9wKCIlIG9mIGNlbGxzIHdpdGgiICwgInJhdGUgb2YgbWF0dXJhdGlvbiBcdTAzYmMgPCAxIn4gbWluXnstMX0pKSkrCiAgIyB5bGFiKFRlWCgiJSBvZiBjZWxscyB3aXRoIHJhdGUgb2YgbWF0dXJhdGlvbiAkKFxcbXUpIDwgMVxcIG1pbl57LTF9JCIpKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICNjaGFuZ2VkIHRvIDEyIGZvciBHUkMgZnJvbSA4CiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjUsIDEpLCAKICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiLCAKICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgyICwibW0iKSwKICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjEpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuMiksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMykpCmRtLnBlci5sb3cuQmFyUGx0CmBgYAoKYGBge3J9CiNtT0RDCm1vZGMuZHkuY29tcGFyZVBsdCA8LSBmaWdTMi5kZiAlPiUgCiAgZmlsdGVyKHJmcC5tZWFuLmJnLnN1Yi5wdW5jdGEgPiAwKSAlPiUgCiAgZmlsdGVyKG1vZGVsICVpbiUgYygiZHkuZG0iLCJleHBvbmVudGlhbCIpICkgJT4lIAogIGZpbHRlcihkZWdyb24gJWluJSBjKCJtT0RDIiwibU9EQy4yIiksIHRyZWF0bWVudCA9PSAibm9uZSIsIHJlZCA9PSAicHVwMS1yZnAiLCBkeSA8IDAuNSkgJT4lIAogIG11dGF0ZShkbS5sZXZlbCA9IGlmZWxzZShjZWxsLmlkICVpbiUgaGlnaC5kbSRjZWxsLmlkICwgIj4gMSIsICI8MSIpKSAlPiUgCiAgZHBseXI6OnNlbGVjdChjZWxsLmlkLCBkZWdyb24sIGR5LCBtb2RlbCwgZG0ubGV2ZWwpICU+JSAKICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IGR5LCBuYW1lc19mcm9tID0gbW9kZWwpICU+JQogIGdncGxvdCguLGFlcyh4ID0gZXhwb25lbnRpYWwsIHkgPSBkeS5kbSAsIGNvbG9yID0gZG0ubGV2ZWwpKSsKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDAuMDEpKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSkrCiAgc3RhdF9jb3Ioc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpKwogIHRoZW1lX3B1YnIoKSsKICB4bGFiKFRlWCgiUmF0ZSBvZiBEZWNheSBmcm9tIEVxLiA4LCAoJFxcZGVsdGEgLCBtaW5eey0xfSQpIikpKwogIHlsYWIoVGVYKCJSYXRlIG9mIERlY2F5IGZyb20gRXEuIDYsICgkXFxkZWx0YSAsIG1pbl57LTF9JCkiKSkrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksIAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwKICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gInZlcnRpY2FsIiwgCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjgsMC4xKSwKICAgICAgICBsZWdlbmQuc3BhY2luZy55ID0gdW5pdCgtMC41LCJtbSIpLAogICAgICAgIGxlZ2VuZC5zcGFjaW5nLnggPSB1bml0KC0wLjI1LCJjbSIpLAogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0ID0gdW5pdCgxLCAibW0iKSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoInNhbG1vbjMiLCJkb2RnZXJibHVlMyIpLCAKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IFRlWCgiJFxcbXUsIG1pbl57LTF9IikpCgptb2RjLmR5LmNvbXBhcmVQbHQKYGBgCgpgYGB7cn0KZmlnUzIuZGYgJT4lIAogIGZpbHRlcihtb2RlbCA9PSAiZHkuZG0iLCByZWQgPT0gInB1cDEtcmZwIiwgdHJlYXRtZW50ID09Im5vbmUiLCBkZWdyb24gJWluJSBjKCJtT0RDLjIiLCJjbG4yLjMiLCJjbG4yLjQiLCJzdGFibGUuMiIsIlN0YWJsZS4zIikpICU+JSAKICBsZWZ0X2pvaW4oLixuby5vZi5kcCwgYnkgPSAiY2VsbC5pZCIpICU+JSAKICBncm91cF9ieShjZWxsLmlkKSAlPiUKICBtdXRhdGUocm1zZCA9IHNxcnQodmFsdWUvbikpICU+JQogIHVuZ3JvdXAoKSAlPiUgCiAgZ3JvdXBfYnkoZGVncm9uLCBjb2xvbnkpICU+JSAKICBtdXRhdGUocm1zZC5tZWFuLm5vcm0gPSBybXNkL21lYW4ocm1zZCkpICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IHJtc2QubWVhbi5ub3JtICkpKwogIGdlb21faGlzdG9ncmFtKCkrCiAgZmFjZXRfZ3JpZChjb2xvbnl+ZGVncm9uLCBzY2FsZXMgPSAiZnJlZSIpCgpmaWdTMi5kZiAlPiUgCiAgZmlsdGVyKG1vZGVsID09ICJkeS5kbSIsIHJlZCA9PSAicHVwMS1yZnAiLCB0cmVhdG1lbnQgPT0ibm9uZSIsIGRlZ3JvbiAlaW4lIGMoIm1PREMuMiIsImNsbjIuMyIsImNsbjIuNCIsInN0YWJsZS4yIiwiU3RhYmxlLjMiKSkgJT4lIAogIGxlZnRfam9pbiguLG5vLm9mLmRwLCBieSA9ICJjZWxsLmlkIikgJT4lIAogIGdyb3VwX2J5KGNlbGwuaWQpICU+JQogIG11dGF0ZShybXNkID0gc3FydCh2YWx1ZS9uKSklPiUKICB1bmdyb3VwKCkgJT4lIAogIGdyb3VwX2J5KGRlZ3JvbiwgY29sb255KSAlPiUgCiAgbXV0YXRlKHJtc2QubWVhbi5ub3JtID0gcm1zZC9tZWFuKHJtc2QpKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBybXNkICkpKwogIGdlb21faGlzdG9ncmFtKCkrCiAgZmFjZXRfZ3JpZChjb2xvbnl+ZGVncm9uLCBzY2FsZXMgPSAiZnJlZSIpCgpmaWdTMi5kZiAlPiUgCiAgZmlsdGVyKHJlZCA9PSAicHVwMS1yZnAiLCB0cmVhdG1lbnQgPT0ibm9uZSIsIGRlZ3JvbiAlaW4lIGMoIm1PREMuMiIsImNsbjIuMyIsImNsbjIuNCIsInN0YWJsZS4yIiwiU3RhYmxlLjMiKSkgJT4lIAogIGxlZnRfam9pbiguLG5vLm9mLmRwLCBieSA9ICJjZWxsLmlkIikgJT4lIAogIGdyb3VwX2J5KGNlbGwuaWQpICU+JQogIG11dGF0ZShybXNkID0gc3FydCh2YWx1ZS9uKSklPiUKICB1bmdyb3VwKCkgJT4lIAogIGdyb3VwX2J5KGRlZ3JvbiwgbW9kZWwpICU+JSAKICBtdXRhdGUocm1zZC5tZWFuLm5vcm0gPSBybXNkL21lYW4ocm1zZCkpICU+JSAKICBmaWx0ZXIocm1zZCA8IDAuKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBybXNkLCBjb2xvciA9IG1vZGVsKSkrCiAgZ2VvbV9mcmVxcG9seSgpKwogIGZhY2V0X3dyYXAofmRlZ3Jvbiwgc2NhbGVzID0gImZyZWUiKSsKICB0aGVtZV9wdWJyKCkrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpCgpgYGAKCmBgYHtyfQpmaWdTMi5kZiAlPiUgCiAgZmlsdGVyKHJlZCA9PSAicHVwMS1yZnAiLCB0cmVhdG1lbnQgPT0ibm9uZSIsIGRlZ3JvbiAlaW4lIGMoIm1PREMuMiIsImNsbjIuMyIsImNsbjIuNCIsInN0YWJsZS4yIiwiU3RhYmxlLjMiKSkgJT4lIAogIGxlZnRfam9pbiguLG5vLm9mLmRwLCBieSA9ICJjZWxsLmlkIikgJT4lIAogIGdyb3VwX2J5KGNlbGwuaWQpICU+JQogIG11dGF0ZShybXNkID0gc3FydCh2YWx1ZS9uKSklPiUKICB1bmdyb3VwKCkgJT4lIAogIGdyb3VwX2J5KGRlZ3JvbiwgbW9kZWwpICU+JSAKICBtdXRhdGUocm1zZC5tZWFuLm5vcm0gPSBybXNkL21lYW4ocm1zZCkpICU+JSAKICBmaWx0ZXIocm1zZCA+IDAuMSkKICBnZ3Bsb3QoLixhZXMoeCA9IHJtc2QsIGNvbG9yID0gbW9kZWwpKSsKICBnZW9tX2ZyZXFwb2x5KCkrCiAgZmFjZXRfd3JhcCh+ZGVncm9uLCBzY2FsZXMgPSAiZnJlZSIpKwogIHRoZW1lX3B1YnIoKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSkKYGBgCgojYWljIHNjb3JlcwpgYGB7cn0KYWljLnNjb3JlLnBsdCA8LSBmaWdTMi5kZiAlPiUgCiAgZmlsdGVyKG1vZGVsICVpbiUgYygiZHkuZG0iLCJleHBvbmVudGlhbCIpKSAlPiUgCiAgZmlsdGVyKGRlZ3JvbiAlaW4lIGMoImNsbjIuMyIsIm1PREMuMiIsInN0YWJsZS4zIiwic3RhYmxlLjIiKSwgdHJlYXRtZW50ID09ICJub25lIiwgcmVkID09ICJwdXAxLXJmcCIpICU+JQogIGdyb3VwX2J5KGNlbGwuaWQpICU+JSAKICBmaWx0ZXIoIShpcy5uYShkeSkpLCAKICAgICAgICAgaWZlbHNlKGRlZ3JvbiAlaW4lIGMoInN0YWJsZS4zIiwic3RhYmxlLjIiKSwgZHkgPCAwLjEsIGR5IDwwLjUpKSAlPiUgCiAgc2VsZWN0KGNlbGwuaWQsIGRlZ3JvbiwgZG0sZHksYWljLCBtb2RlbCwgY29sb255KSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IGMoImR5IiwiYWljIiwiZG0iKSwgbmFtZXNfZnJvbSA9ICJtb2RlbCIpICAlPiUgCiAgbXV0YXRlKGRtX2R5LmRtID0gaWZlbHNlKGlzLm5hKGRtX2R5LmRtKSwgSW5mLCBkbV9keS5kbSksCiAgICBkbS5sZXZlbCA9IGlmZWxzZShkbV9keS5kbSA+IDEsICJoaWdoIiwgImxvdyIpKSAlPiUKICBtdXRhdGUoZGVncm9uID0gY2FzZV93aGVuKGRlZ3JvbiAlaW4lIGMoImNsbjIuMyIsImNsbjIuNCIpIH4gIkdGUC1DTE4yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JvbiAlaW4lIGMoIm1PREMuMiIpIH4gIkdGUC1tT0RDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JvbiAlaW4lIGMoInN0YWJsZS4yIiwic3RhYmxlLjMiKSB+ICJHRlAiKSwKICAgICAgICAgZGVncm9uID0gZmFjdG9yKGRlZ3JvbiwgbGV2ZWxzID0gYygiR0ZQLW1PREMiLCJHRlAtQ0xOMiIsIkdGUCIpKSklPiUKICBnZ3Bsb3QoLixhZXMoeCA9IGFpY19leHBvbmVudGlhbCwgeSA9IGFpY19keS5kbSkpKwogIGdlb21fcG9pbnQoc2l6ZSA9IDAuMikrCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBjb2xvciA9ICJyZWQ0IikrCiAgZmFjZXRfd3JhcCh+ZGVncm9uLCBzY2FsZXMgPSAiZnJlZSIpKwogIHNjYWxlX2NvbG9yX2lkZW50aXR5KCkrCiAgdGhlbWVfcHVicigpKwogIHhsaW0oLTMwMCwtMTAwKSsKICB5bGltKC0zMDAsLTEwMCkrCiAgeGxhYigiQUlDIHNjb3JlcyBmb3IgRXEgOCIpKwogIHlsYWIoIkFJQyBzY29yZXMgZm9yIEVxIDYiKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwKSwgCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjEpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuMiksCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSkKCmFpYy5zY29yZS5wbHQKCmBgYAoKYGBge3J9CmFpYy5zY29yZS5wdERlblBsdCA8LSBmaWdTMi5kZiAlPiUgCiAgZmlsdGVyKG1vZGVsICVpbiUgYygiZHkuZG0iLCJleHBvbmVudGlhbCIpKSAlPiUgCiAgZmlsdGVyKGRlZ3JvbiAlaW4lIGMoImNsbjIuMyIsImNsbjIuNCIsIm1PREMuMiIsInN0YWJsZS4yIiwic3RhYmxlLjMiKSwgdHJlYXRtZW50ID09ICJub25lIiwgcmVkID09ICJwdXAxLXJmcCIpICU+JQogIGdyb3VwX2J5KGNlbGwuaWQpICU+JSAKICBmaWx0ZXIoIShpcy5uYShkeSkpLCAKICAgICAgICAgaWZlbHNlKGRlZ3JvbiAlaW4lIGMoInN0YWJsZS4zIiwic3RhYmxlLjIiKSwgZHkgPCAwLjEsIGR5IDwwLjIpKSAlPiUgCiAgZHBseXI6OnNlbGVjdChjZWxsLmlkLCBkZWdyb24sIGRtLGR5LGFpYywgbW9kZWwsIGNvbG9ueSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgcGl2b3Rfd2lkZXIodmFsdWVzX2Zyb20gPSBjKCJkeSIsImFpYyIsImRtIiksIG5hbWVzX2Zyb20gPSAibW9kZWwiKSAgJT4lIAogIG11dGF0ZShkbV9keS5kbSA9IGlmZWxzZShpcy5uYShkbV9keS5kbSksIEluZiwgZG1fZHkuZG0pLAogICAgZG0ubGV2ZWwgPSBpZmVsc2UoZG1fZHkuZG0gPiAxLCAiaGlnaCIsICJsb3ciKSkgJT4lIAogIG11dGF0ZShkZWdyb24gPSBjYXNlX3doZW4oZGVncm9uICVpbiUgYygiY2xuMi4zIiwiY2xuMi40IikgfiAieWVHRlAtQ0xOMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyb24gJWluJSBjKCJtT0RDLjIiKSB+ICJ5ZUdGUC1tT0RDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JvbiAlaW4lIGMoInN0YWJsZS4yIiwic3RhYmxlLjMiKSB+ICJ5ZUdGUCIpLAogICAgICAgICBkZWdyb24gPSBmYWN0b3IoZGVncm9uLCBsZXZlbHMgPSBjKCJ5ZUdGUC1tT0RDIiwieWVHRlAtQ0xOMiIsInllR0ZQIikpKSU+JQogIGdncGxvdCguLGFlcyh5ID0gYWljX2V4cG9uZW50aWFsLCB4ID0gYWljX2R5LmRtKSkrCiAgIyBnZW9tX2hleChiaW5zID0gMTAwKSsKICBnZ3BvaW50ZGVuc2l0eTo6Z2VvbV9wb2ludGRlbnNpdHkoc2l6ZSA9IDAuMiwgYWRqdXN0ID0gNCkrCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBjb2xvciA9ICJyZWQ0IiwgYWxwaGEgPSAwLjUpKwogIGZhY2V0X3dyYXAofmRlZ3Jvbiwgc2NhbGVzID0gImZyZWUiKSsKICB0aGVtZV9wdWJyKCkrCiAgeGxpbSgtMzUwLC0xMDApKwogIHlsaW0oLTM1MCwtMTAwKSsKICBsYWJzKHRpdGxlID0gIk1vZGVsIGNvbXBhcmlzb24gcGVyIGNlbGw6XG5Ba2Fpa2UgSW5mb3JtYXRpb24gQ3JpdGVyaW9uIChBSUMpIikrCiAgeWxhYigiQUlDIFtFeHBvbmVudGlhbCBtb2RlbF0iKSsKICB4bGFiKCJBSUMgWzItUGFyYW1ldGVyIG1vZGVsIHcgTWF0dXJhdGlvbl0iKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksICNjaGFuZ2VkIHRvIDEyIGZvciBHUkMgZnJvbSA4CiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCksIAogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShzaXplID0gMC4xKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjIpLAogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgxLjUgLCJtbSIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC45NSwwLjIpLAogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAidmVydGljYWwiLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKCmFpYy5zY29yZS5wdERlblBsdApgYGAKCiNkeSBzY2F0dGVycGxvdApgYGB7cn0KZHkubW9kZWxzLnNjYXRQbHQgPC0gZmlnUzIuZGYgJT4lIAogIGZpbHRlcihtb2RlbCAlaW4lIGMoImR5LmRtIiwiZXhwb25lbnRpYWwiKSkgJT4lIAogIGZpbHRlcihkZWdyb24gJWluJSBjKCJjbG4yLjMiLCJjbG4yLjQiLCJzdGFibGUuMiIsIm1PREMuMiIsInN0YWJsZS4zIiksIHRyZWF0bWVudCA9PSAibm9uZSIsIHJlZCA9PSAicHVwMS1yZnAiKSAlPiUKICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgZmlsdGVyKCEoaXMubmEoZHkpKSwgCiAgICAgICAgIGlmZWxzZShkZWdyb24gJWluJSBjKCJzdGFibGUuMyIsInN0YWJsZS4yIiksIGR5IDwgMC4xLCBkeSA8MC4yKSkgJT4lIAogIGRwbHlyOjpzZWxlY3QoY2VsbC5pZCwgZGVncm9uLCBkbSxkeSxhaWMsIG1vZGVsLCBjb2xvbnkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIHBpdm90X3dpZGVyKHZhbHVlc19mcm9tID0gYygiZHkiLCJhaWMiLCJkbSIpLCBuYW1lc19mcm9tID0gIm1vZGVsIikgICU+JSAKICBtdXRhdGUoZG1fZHkuZG0gPSBpZmVsc2UoaXMubmEoZG1fZHkuZG0pLCBJbmYsIGRtX2R5LmRtKSwKICAgIGRtLmxldmVsID0gaWZlbHNlKGRtX2R5LmRtID4gMSwgImhpZ2giLCAibG93IikpICU+JQogIG11dGF0ZShkZWdyb24gPSBjYXNlX3doZW4oZGVncm9uICVpbiUgYygiY2xuMi4zIiwiY2xuMi40IikgfiAieWVHRlAtQ0xOMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyb24gJWluJSBjKCJtT0RDLjIiKSB+ICJ5ZUdGUC1tT0RDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JvbiAlaW4lIGMoInN0YWJsZS4yIiwic3RhYmxlLjMiKSB+ICJ5ZUdGUCIpLAogICAgICAgICBkZWdyb24gPSBmYWN0b3IoZGVncm9uLCBsZXZlbHMgPSBjKCJ5ZUdGUC1tT0RDIiwieWVHRlAtQ0xOMiIsInllR0ZQIikpKSU+JQogIGdncGxvdCguLGFlcyh5ID0gZHlfZXhwb25lbnRpYWwsIHggPSBkeV9keS5kbSkpKwogICMgZ2VvbV9oZXgoYmlucyA9IDEwMCkrCiAgZ2dwb2ludGRlbnNpdHk6Omdlb21fcG9pbnRkZW5zaXR5KHNpemUgPSAwLjIsIGFkanVzdCA9IDAuNSkrCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBjb2xvciA9ICJyZWQ0IiwgYWxwaGEgPSAwLjUpKwogIGZhY2V0X3dyYXAofmRlZ3Jvbiwgc2NhbGVzID0gImZyZWUiKSsKICB0aGVtZV9wdWJyKCkrCiAgeWxhYihUZVgoIkV4cG9uZW50aWFsIG1vZGVsICgkXFxkZWx0YV97ZXhwfSQpIikpKwogIHhsYWIoVGVYKCIyLXBhcmFtZXRlciBtb2RlbCB3IE1hdHVyYXRpb24gKCRcXGRlbHRhX3ttYXR9JCkiKSkrCiAgbGFicyh0aXRsZSA9ICJSYXRlIG9mIERlY2F5IikrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCNjaGFuZ2VkIHRvIDEyIGZvciBHUkMgZnJvbSA4CiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCksIAogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShzaXplID0gMC4xKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjIpLAogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgxLjUsIm1tIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjk1LDAuMiksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJ2ZXJ0aWNhbCIsCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQpkeS5tb2RlbHMuc2NhdFBsdApgYGAKCmRpc3RyaWJ1dGlvbnMgb2YgZHkgCmdlb29tX2ZyZWFrX3BvbHkKYGBge3J9CmR5Lm1vZGVscy5kZW4ucGx0IDwtIGZpZ1MyLmRmICU+JSAKICBmaWx0ZXIoZGVncm9uICVpbiUgYygibU9EQy4yIiwiY2xuMi4zIiwiY2xuMi40Iiwic3RhYmxlLjIiLCJzdGFibGUuMyIpLCB0cmVhdG1lbnQgPT0gIm5vbmUiLCByZWQgPT0gInB1cDEtcmZwIikgJT4lCiAgZ3JvdXBfYnkoY2VsbC5pZCkgJT4lIAogIGZpbHRlcighKGlzLm5hKGR5KSksIAogICAgICAgICBpZmVsc2UoZGVncm9uICVpbiUgYygic3RhYmxlLjMiLCJzdGFibGUuMiIpLCBkeSA8IDAuMSwgZHkgPDAuNSkpICU+JSAKICBzZWxlY3QoY2VsbC5pZCwgZGVncm9uLCBkeSxhaWMsIG1vZGVsLCBjb2xvbnkpICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKGRlZ3JvbiA9IGNhc2Vfd2hlbihkZWdyb24gJWluJSBjKCJjbG4yLjMiLCJjbG4yLjQiKSB+ICJHRlAtQ0xOMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyb24gJWluJSBjKCJtT0RDLjIiKSB+ICJHRlAtbU9EQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyb24gJWluJSBjKCJzdGFibGUuMiIsInN0YWJsZS4zIikgfiAiR0ZQIiksCiAgICAgICAgIGRlZ3JvbiA9IGZhY3RvcihkZWdyb24sIGxldmVscyA9IGMoIkdGUC1tT0RDIiwiR0ZQLUNMTjIiLCJHRlAiKSkpJT4lCiAgZ2dwbG90KC4sYWVzKHggPSBkeSwgY29sb3IgPSBtb2RlbCkpKwogICMgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC41KSsKICBnZW9tX2ZyZXFwb2x5KCkrCiAgZmFjZXRfd3JhcCh+ZGVncm9uLCBzY2FsZXMgPSAiZnJlZSIsCiAgICAgICAgICAgICBsYWJlbGxlciA9ICBsYWJlbF93cmFwX2dlbih3aWR0aCA9IDMgLCBtdWx0aV9saW5lID0gVCkpKwogIHRoZW1lX3B1YnIoKSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYnJvd240IiwgInNreWJsdWU0IiksIG5hbWUgPSBOVUxMLCBsYWJlbHMgPSBjKCJFcSA2IiwgIkVxIDgiKSkrCiAgeGxhYihUZVgoIlJhdGUgb2YgZGVjYXkgKCRcXGRlbHRhLCBtaW5eey0xfSQpIikpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLCAKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwLCBoanVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIAogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDQgLCJtbSIpLAogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShzaXplID0gMC4xKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjIpLAogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkKICAgICAgICApCgpkeS5tb2RlbHMuZGVuLnBsdApgYGAKCmBgYHtyfQpmaWdTMi5kZiAlPiUgCiAgZHBseXI6OnNlbGVjdChjZWxsLmlkLCBkbSwgZHksIG1vZGVsLCBkZWdyb24sIGdmcC5tZWFuLmJnLmFmLnN1Yi5uZXcpICU+JSAKICBkcGx5cjo6dW5ncm91cCgpICU+JSAKICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IGMoImR5IiwiZG0iKSwgbmFtZXNfZnJvbSA9IG1vZGVsKSAlPiUgCiAgbXV0YXRlKGRtLmxldmVsID0gaWZlbHNlKGRtX2R5LmRtID4gMSwgImhpZ2giLCAibG93IiksCiAgICBleHAubWF0LnJhdGlvID0gKChkeV9keS5kbSAtIGR5X2V4cG9uZW50aWFsKS9keV9keS5kbSkqMTAwKSAlPiUgCiAgZmlsdGVyKCEoaXMubmEoZXhwLm1hdC5yYXRpbykpKSU+JQogIGZpbHRlcihkZWdyb24gJWluJSBjKCJtT0RDLjIiLCJjbG4yLjMiLCJjbG4yLjQiLCJzdGFibGUuMyIsInN0YWJsZS4yIikpICU+JSAKICBncm91cF9ieShkZWdyb24sIGRtLmxldmVsKSAlPiUgCiAgdGFsbHkoKQpgYGAKClVuZGVyZXN0aW1hdGlvbiBvZiB0aGUgZGVjYXkgcmF0ZXMgCkRlY2F5IHJhdGVzIGFyZSBoaWdoZXIgaW4gdGhlIG1hdHVyYXRpb24gbW9kZWwgY29tcGFyZWQgdG8gdGhlIGV4cG9uZW50aWFsIG1vZGVsCgpgYGB7cn0KZGYudW5kZXJFc3QgPC0gZmlnUzIuZGYgJT4lIAogIGRwbHlyOjpzZWxlY3QoY2VsbC5pZCwgZG0sIGR5LCBtb2RlbCwgZGVncm9uLCBnZnAubWVhbi5iZy5hZi5zdWIubmV3KSAlPiUgCiAgZHBseXI6OnVuZ3JvdXAoKSAlPiUgCiAgcGl2b3Rfd2lkZXIodmFsdWVzX2Zyb20gPSBjKCJkeSIsImRtIiksIG5hbWVzX2Zyb20gPSBtb2RlbCkgJT4lIAogIG11dGF0ZShkbS5sZXZlbCA9IGlmZWxzZShkbV9keS5kbSA+IDEsICI+MSIsICI8MSIpLAogICAgZXhwLm1hdC5yYXRpbyA9ICgoZHlfZHkuZG0gLSBkeV9leHBvbmVudGlhbCkvZHlfZHkuZG0pKjEwMCkgJT4lIAogIGZpbHRlcighKGlzLm5hKGV4cC5tYXQucmF0aW8pKSklPiUKICBmaWx0ZXIoZGVncm9uICVpbiUgYygibU9EQy4yIiwiY2xuMi40IiwiY2xuMi4zIiwic3RhYmxlLjIiLCJzdGFibGUuMyIpKSAlPiUgCiAgbXV0YXRlKGRlZ3JvbiA9IGNhc2Vfd2hlbihkZWdyb24gJWluJSBjKCJjbG4yLjMiLCJjbG4yLjQiKSB+ICJ5ZUdGUC1DTE4yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JvbiAlaW4lIGMoIm1PREMuMiIpIH4gInllR0ZQLW1PREMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVncm9uICVpbiUgYygic3RhYmxlLjIiLCJzdGFibGUuMyIpIH4gInllR0ZQIiksCiAgICAgICAgIGRlZ3JvbiA9IGZhY3RvcihkZWdyb24sIGxldmVscyA9IGMoInllR0ZQLW1PREMiLCJ5ZUdGUC1DTE4yIiwieWVHRlAiKSkpICU+JSAKICBncm91cF9ieShkZWdyb24sIGRtLmxldmVsKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBOUk9XKGV4cC5tYXQucmF0aW8pLCAKICAgICAgICAgICAgZXhwLm1hdC5yYXRpbyA9IG1pbihleHAubWF0LnJhdGlvKS0yKQoKYGBgCgpgYGB7cn0KI2JveHBsb3Qgb2YgdGhlIHVuZGVyZXN0aW1hdGlvbiAKdW5kZXJFc3QuYngucGx0IDwtIGZpZ1MyLmRmICU+JSAKICBkcGx5cjo6c2VsZWN0KGNlbGwuaWQsIGRtLCBkeSwgbW9kZWwsIGRlZ3JvbiwgZ2ZwLm1lYW4uYmcuYWYuc3ViLm5ldykgJT4lIAogIGRwbHlyOjp1bmdyb3VwKCkgJT4lIAogIHBpdm90X3dpZGVyKHZhbHVlc19mcm9tID0gYygiZHkiLCJkbSIpLCBuYW1lc19mcm9tID0gbW9kZWwpICU+JSAKICBtdXRhdGUoZG0ubGV2ZWwgPSBpZmVsc2UoZG1fZHkuZG0gPiAxLCAiPjEiLCAiPDEiKSwKICAgIGV4cC5tYXQucmF0aW8gPSAoKGR5X2R5LmRtIC0gZHlfZXhwb25lbnRpYWwpL2R5X2R5LmRtKSoxMDApICU+JSAKICBmaWx0ZXIoIShpcy5uYShleHAubWF0LnJhdGlvKSkpJT4lCiAgZmlsdGVyKGRlZ3JvbiAlaW4lIGMoIm1PREMuMiIsImNsbjIuMyIsInN0YWJsZS4zIiwic3RhYmxlLjIiLCJjbG4yLjQiKSkgJT4lIAogIG11dGF0ZShkZWdyb24gPSBjYXNlX3doZW4oZGVncm9uICVpbiUgYygiY2xuMi4zIiwiY2xuMi40IikgfiAieWVHRlAtQ0xOMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyb24gJWluJSBjKCJtT0RDLjIiKSB+ICJ5ZUdGUC1tT0RDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JvbiAlaW4lIGMoInN0YWJsZS4yIiwic3RhYmxlLjMiKSB+ICJ5ZUdGUCIpLAogICAgICAgICBkZWdyb24gPSBmYWN0b3IoZGVncm9uLCBsZXZlbHMgPSBjKCJ5ZUdGUC1tT0RDIiwieWVHRlAtQ0xOMiIsInllR0ZQIikpKSU+JQogIGdncGxvdCguLGFlcyh4ID0gZGVncm9uLCB5ID0gZXhwLm1hdC5yYXRpbyxmaWxsID0gZG0ubGV2ZWwpKSsKICBnZW9tX2JveHBsb3Qob3V0bGllci5zaXplID0gMC4yLCAKICAgICAgICAgICAgICAgbHdkID0gMC4xKSsKICBnZW9tX3RleHQoZGF0YSA9IGRmLnVuZGVyRXN0ICU+JSAKICAgICAgICAgICAgICBncm91cF9ieShkbS5sZXZlbCksIAogICAgICAgICAgICBhZXMobGFiZWwgPSBwYXN0ZSgibiA9IixuKSwgZmlsbCA9IGRtLmxldmVsKSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksIHNpemUgPSA0KSsgI2NoYW5nZWQgZnJvbSAyIHRvIDQgZm9yIGdyYwogIHRoZW1lX3B1YnIoKSsKICAjIHNjYWxlX2ZpbGxfYnJld2VyKG5hbWUgPSAiUmVwbGljYXRlIiwgcGFsZXR0ZSA9ICJTZXQyIikrCiAgeWxhYihUZVgoIiUgdW5kZXJlc3RpbWF0aW9uIG9mIFxucmF0ZSBvZiBkZWNheSAoJFxcZnJhY3tcXGRlbHRhX3ttYXR9IC0gXFxkZWx0YV97ZXhwfX17XFxkZWx0YV97bWF0fX0kKSIpKSsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShzaXplID0gMC4xKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjIpLAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwjY2hhbmdlZCB0byAxMiBmb3IgR1JDIGZyb20gOAogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAidmVydGljYWwiLCAKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKDAuOSwwLjkpLAogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0ID0gdW5pdCgzLCAibW0iKSkrCiAgICAgICAgIyBsZWdlbmQucG9zaXRpb24gPSBjKGZhY3RvcigiR0ZQLUNMTjIiKSwgNDApKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJzYWxtb24zIiwiZG9kZ2VyYmx1ZTMiKSwgCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBUZVgoIiRcXG11LCBtaW5eey0xfSIpKSsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMykpCgp1bmRlckVzdC5ieC5wbHQKYGBgCkFkZGVkIHRoZSBwcm90ZWluIGluaGliaWl0aW9uIGRhdGEgc2V0CmBgYHtyfQpmaWdzMi5wcnRJbiA8LSBkeS5wdXAxICU+JSAKICBsZWZ0X2pvaW4oLixwdXAxLnByb0luaGkuYXR0ciAlPiUKICAgICAgICAgICAgICBmaWx0ZXIocmVkID09ICJwdXAxLXJmcCIpLAogICAgICAgICAgICBieSA9IGMoImNlbGwuaWQiLCJ0cmVhdG1lbnQiLCJkZWdyb24iLCJyZWQiLCJjb2xvbnkiLCJleHAuZmllbGQiKSkgJT4lIAogIG11dGF0ZShkYXBpLm1lYW4uYmcuc3ViLnB1bmN0YSA9IGlmZWxzZShpcy5uYShkYXBpLm1lYW4uYmcuc3ViLnB1bmN0YSksIDAsIGRhcGkubWVhbi5iZy5zdWIucHVuY3RhKSAsIAogICAgICAgICByZnAubWVhbi5iZy5zdWIucHVuY3RhID0gaWZlbHNlKGlzLm5hKHJmcC5tZWFuLmJnLnN1Yi5wdW5jdGEpLCAwICwgcmZwLm1lYW4uYmcuc3ViLnB1bmN0YSkpICU+JSAKICBmaWx0ZXIocmZwLm1lYW4uYmcuc3ViLnB1bmN0YSA+IDApCmBgYAojd2l0aCBwcm90ZWFzb21lIGluaGliaXRpb24KIyNwZXJjZW50IGNlbGxzIHdpdGggbXUgPCAxCmBgYHtyfQpmaWdzMi5wcnRJbiAlPiUgCiAgZmlsdGVyKHJmcC5tZWFuLmJnLnN1Yi5wdW5jdGEgPiAwLAogICAgICAgICB0cmVhdG1lbnQgIT0gIm5vbmUiKSAlPiUgCiAgZmlsdGVyKG1vZGVsID09ICJkeS5kbSIpICU+JSAKICBmaWx0ZXIoaWZlbHNlKHRyZWF0bWVudCA9PSAiNXVNIiwgZHkgPiAwLjAwNSwgZHkgPCAwLjUpLCAKICAgICAgICAgZG0gPiAwLjAwMDAxKSAlPiUgCiAgbXV0YXRlKGRtLmxldmVsID0gaWZlbHNlKGRtID4gMSwgImhpZ2giLCAibG93IiksCiAgICBkZWdyb24gPSBjYXNlX3doZW4oZGVncm9uICVpbiUgYygibU9EQyIsIm1PREMuMiIpIH4gIkdGUC1tT0RDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JvbiAlaW4lIGMoImNsbjIuMiIsImNsbjIiLCJjbG4yLjMiLCJjbG4yLjQiKSB+ICJHRlAtQ0xOMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyb24gJWluJSBjKCJzdGFibGUiLCJzdGFibGUuMiIsInN0YWJsZS4zIikgfiAiR0ZQIiksIAogICAgICAgICB0cmVhdG1lbnQgPSBmYWN0b3IodHJlYXRtZW50LCBsZXZlbHMgPSBjKCJkbXNvMSIsImRtc28yIiwiMXVNIiwiMi41dU0iLCI1dU0iLCI1MHVNIikpKSAlPiUgCiAgZ3JvdXBfYnkodHJlYXRtZW50LCBkbS5sZXZlbCkgJT4lIAogIHRhbGx5KCkgJT4lIAogIHBpdm90X3dpZGVyKHZhbHVlc19mcm9tID0gbiwgbmFtZXNfZnJvbSA9IGRtLmxldmVsKSAlPiUgCiAgbXV0YXRlKHBlci5sb3cgPSAobG93Lyhsb3craGlnaCkpKjEwMCApICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IHRyZWF0bWVudCwgeSA9IHBlci5sb3cpKSsKICBnZW9tX2NvbCh3aWR0aCA9IDAuMikrCiAgdGhlbWVfcHVicigpKwogIHlsYWIoYnF1b3RlKGF0b3AoIiUgb2YgY2VsbHMgd2l0aCIgLCAicmF0ZSBvZiBtYXR1cmF0aW9uIFx1MDNiYyA8IDEifiBtaW5eey0xfSkpKSsKICAjIHlsYWIoVGVYKCIlIG9mIGNlbGxzIHdpdGggcmF0ZSBvZiBtYXR1cmF0aW9uICQoXFxtdSkgPCAxXFwgbWluXnstMX0kIikpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLCAKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKDAuNSwgMSksIAogICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIAogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDIgLCJtbSIpLAogICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuMSksCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShzaXplID0gMC4yKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAzKSkKYGBgCmBgYHtyfQpsb2coMikvMC41MDAwMDAwCmBgYAojI0FJQyBzY29yZXMKYGBge3J9CmZpZ3MyLnBydEluICU+JSAKICBmaWx0ZXIocmZwLm1lYW4uYmcuc3ViLnB1bmN0YSA+IDAsCiAgICAgICAgIHRyZWF0bWVudCAhPSAibm9uZSIpICU+JSAKZmlsdGVyKG1vZGVsICVpbiUgYygiZHkuZG0iLCJleHBvbmVudGlhbCIpKSAlPiUKICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgZmlsdGVyKCEoaXMubmEoZHkpKSwgCiAgICAgICAgIGlmZWxzZShkZWdyb24gPT0gIjV1TSIsIGR5ID4gMC4wMDUwMDAwMDAsIGR5IDwgMC41KSkgJT4lIAogIGRwbHlyOjpzZWxlY3QoY2VsbC5pZCwgdHJlYXRtZW50LCBkbSxkeSxhaWMsIG1vZGVsLCBjb2xvbnkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIHBpdm90X3dpZGVyKHZhbHVlc19mcm9tID0gYygiZHkiLCJhaWMiLCJkbSIpLCBuYW1lc19mcm9tID0gIm1vZGVsIikgICU+JSAKICBtdXRhdGUoZG1fZHkuZG0gPSBpZmVsc2UoaXMubmEoZG1fZHkuZG0pLCBJbmYsIGRtX2R5LmRtKSwKICAgIGRtLmxldmVsID0gaWZlbHNlKGRtX2R5LmRtID4gMSwgImhpZ2giLCAibG93IikpICU+JQogIG11dGF0ZSggdHJlYXRtZW50ID0gY2FzZV93aGVuKHRyZWF0bWVudCAlaW4lIGMoImRtc28xIiwiZG1zbzIiKSB+ICJETVNPIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gdHJlYXRtZW50KSwgCiAgICAgICAgIHRyZWF0bWVudCA9IGZhY3Rvcih0cmVhdG1lbnQsIGxldmVscyA9IGMoIkRNU08iLCIxdU0iLCIyLjV1TSIsIjV1TSIsIjUwdU0iKSkpICU+JSAKICBnZ3Bsb3QoLixhZXMoeSA9IGFpY19leHBvbmVudGlhbCwgeCA9IGFpY19keS5kbSkpKwogICMgZ2VvbV9oZXgoYmlucyA9IDEwMCkrCiAgZ2dwb2ludGRlbnNpdHk6Omdlb21fcG9pbnRkZW5zaXR5KHNpemUgPSAwLjIsIGFkanVzdCA9IDAuNSkrCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBjb2xvciA9ICJyZWQ0IiwgYWxwaGEgPSAwLjUpKwogIGZhY2V0X3dyYXAofnRyZWF0bWVudCwgc2NhbGVzID0gImZyZWUiKSsKICB0aGVtZV9wdWJyKCkrCiAgeWxhYihUZVgoIkV4cG9uZW50aWFsIG1vZGVsICgkXFxkZWx0YV97ZXhwfSQpIikpKwogIHhsYWIoVGVYKCIyLXBhcmFtZXRlciBtb2RlbCB3IE1hdHVyYXRpb24gKCRcXGRlbHRhX3ttYXR9JCkiKSkrCiAgbGFicyh0aXRsZSA9ICJBSUMgc2NvcmVzIikrCiAgeGxpbSgtMzUwLC0xMDApKwogIHlsaW0oLTM1MCwtMTAwKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksI2NoYW5nZWQgdG8gMTIgZm9yIEdSQyBmcm9tIDgKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwKSwgCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjEpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuMiksCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDEuNSwibW0iKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKDAuOTUsMC4yKSwKICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gInZlcnRpY2FsIiwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKIyNkeSBzY2F0dGVyIHBsb3Qgd2l0aCBQSQpgYGB7cn0KZmlnczIucHJ0SW4gJT4lIAogIGZpbHRlcihyZnAubWVhbi5iZy5zdWIucHVuY3RhID4gMCwKICAgICAgICAgdHJlYXRtZW50ICE9ICJub25lIikgJT4lIApmaWx0ZXIobW9kZWwgJWluJSBjKCJkeS5kbSIsImV4cG9uZW50aWFsIikpICU+JQogIGdyb3VwX2J5KGNlbGwuaWQpICU+JSAKICBmaWx0ZXIoIShpcy5uYShkeSkpLCAKICAgICAgICAgaWZlbHNlKGRlZ3JvbiA9PSAiNXVNIiwgZHkgPiAwLjAwNTAwMDAwMCwgZHkgPCAwLjUpKSAlPiUgCiAgZHBseXI6OnNlbGVjdChjZWxsLmlkLCB0cmVhdG1lbnQsIGRtLGR5LGFpYywgbW9kZWwsIGNvbG9ueSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgcGl2b3Rfd2lkZXIodmFsdWVzX2Zyb20gPSBjKCJkeSIsImFpYyIsImRtIiksIG5hbWVzX2Zyb20gPSAibW9kZWwiKSAgJT4lIAogIG11dGF0ZShkbV9keS5kbSA9IGlmZWxzZShpcy5uYShkbV9keS5kbSksIEluZiwgZG1fZHkuZG0pLAogICAgZG0ubGV2ZWwgPSBpZmVsc2UoZG1fZHkuZG0gPiAxLCAiaGlnaCIsICJsb3ciKSkgJT4lCiAgbXV0YXRlKCB0cmVhdG1lbnQgPSBjYXNlX3doZW4odHJlYXRtZW50ICVpbiUgYygiZG1zbzEiLCJkbXNvMiIpIH4gIkRNU08iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiB0cmVhdG1lbnQpLCAKICAgICAgICAgdHJlYXRtZW50ID0gZmFjdG9yKHRyZWF0bWVudCwgbGV2ZWxzID0gYygiRE1TTyIsIjF1TSIsIjIuNXVNIiwiNXVNIiwiNTB1TSIpKSkgJT4lIAogIGdncGxvdCguLGFlcyh5ID0gZHlfZXhwb25lbnRpYWwsIHggPSBkeV9keS5kbSkpKwogICMgZ2VvbV9oZXgoYmlucyA9IDEwMCkrCiAgZ2dwb2ludGRlbnNpdHk6Omdlb21fcG9pbnRkZW5zaXR5KHNpemUgPSAwLjIsIGFkanVzdCA9IDAuNSkrCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBjb2xvciA9ICJyZWQ0IiwgYWxwaGEgPSAwLjUpKwogIGZhY2V0X3dyYXAofnRyZWF0bWVudCwgc2NhbGVzID0gImZyZWUiKSsKICB0aGVtZV9wdWJyKCkrCiAgeWxhYihUZVgoIkV4cG9uZW50aWFsIG1vZGVsICgkXFxkZWx0YV97ZXhwfSQpIikpKwogIHhsYWIoVGVYKCIyLXBhcmFtZXRlciBtb2RlbCB3IE1hdHVyYXRpb24gKCRcXGRlbHRhX3ttYXR9JCkiKSkrCiAgbGFicyh0aXRsZSA9ICJSYXRlIG9mIERlY2F5IikrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCNjaGFuZ2VkIHRvIDEyIGZvciBHUkMgZnJvbSA4CiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCksIAogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShzaXplID0gMC4xKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjIpLAogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgxLjUsIm1tIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjk1LDAuMiksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJ2ZXJ0aWNhbCIsCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCm1vZGVscyB3aXRoIGxlYXN0IEFJQyBzY29yZXMKYGBge3J9CmxlYXN0LmFpYy5wbHQgPC0gZmlnUzIuZGYgJT4lIAogIGZpbHRlcihyZnAubWVhbi5iZy5zdWIucHVuY3RhID4gMCkgJT4lIAogIGZpbHRlcihtb2RlbCAlaW4lIGMoImR5LmRtIiwiZXhwb25lbnRpYWwiKSkgJT4lIAogIGZpbHRlcihkZWdyb24gJWluJSBjKCJtT0RDIiwibU9EQy4yIiwiY2xuMiIsImNsbjIuMyIsImNsbjIuMiIsInN0YWJsZS4yIiwic3RhYmxlIiksIHRyZWF0bWVudCA9PSAibm9uZSIsIHJlZCA9PSAicHVwMS1yZnAiKSAlPiUKICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgZmlsdGVyKGFpYyA9PSBtaW4oYWljKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgIyBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gbmFtZSwgdmFsdWVzX2Zyb20gPSB2YWx1ZSkgJT4lIAogIGdyb3VwX2J5KGRlZ3JvbiwgY29sb255LG1vZGVsKSAlPiUgCiAgdGFsbHkoKSAlPiUgCiAgbXV0YXRlKHBlcmMgPSAobi9zdW0obikpKjEwMCkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlKGRlZ3JvbiA9IGNhc2Vfd2hlbihkZWdyb24gJWluJSBjKCJtT0RDIiwibU9EQy4yIikgfiAiR0ZQLW1PREMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVncm9uICVpbiUgYygiY2xuMi4yIiwiY2xuMiIsImNsbjIuMyIpIH4gIkdGUC1DTE4yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JvbiAlaW4lIGMoInN0YWJsZSIsInN0YWJsZS4yIikgfiAiR0ZQIiksIAogICAgICAgICBkZWdyb24gPSBmYWN0b3IoZGVncm9uLCBsZXZlbHMgPSBjKCJHRlAtbU9EQyIsIkdGUC1DTE4yIiwiR0ZQIikpKSAlPiUgCiAgbXV0YXRlKG1vZGVsID0gY2FzZV93aGVuKG1vZGVsID09ICJkeS5kbSIgfiAiRXEgNiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsID09ICJleHBvbmVudGlhbCIgfiAiRXEgOCIpKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBtb2RlbCwgeT0gcGVyYywgY29sb3IgPSBjb2xvbnkpKSsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgaGVpZ2h0ID0gMCkrCiAgc3RhdF9zdW1tYXJ5KGZ1bi55ID0gbWVhbiwgZnVuLnltaW4gPSBtZWFuLCBmdW4ueW1heCA9IG1lYW4sCiAgICAgICAgICAgICAgICAgZ2VvbSA9ICJjcm9zc2JhciIsIHdpZHRoID0gMC41KSsKICBmYWNldF93cmFwKH5kZWdyb24sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMykrCiAgdGhlbWVfcHVicigpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLCAKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgCiAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoNCAsIm1tIikpCgpsZWFzdC5haWMucGx0CmBgYAojcGF0Y2h3b3JrCmBgYHtyIGZpZy53aWR0aD0gNS41LCBmaWcuaGVpZ2h0PSA0fQpsZWZ0LnNlYyA8LSBhaWMuc2NvcmUucGx0Cm1pZC5zZWMgPC0gZHkubW9kZWxzLmRlbi5wbHQKcmlnaHQuc2VjIDwtIHVuZGVyRXN0LmJ4LnBsdApmaWdzMi5maW5hbCA8LSAoKGFpYy5zY29yZS5wdERlblBsdC9keS5tb2RlbHMuc2NhdFBsdCl8KGRtLnBlci5sb3cuQmFyUGx0L3VuZGVyRXN0LmJ4LnBsdCkpKwogIHBsb3RfbGF5b3V0KHdpZHRocyA9IGMoMC42NSwwLjM1KSkrCiAgcGxvdF9hbm5vdGF0aW9uKHRhZ19sZXZlbHMgPSAiQSIpCiMgcmlnaHQuc2VjIDwtIHB1cDFSRlAuaGFsZkxpdmVzCgpmaWdzMi5maW5hbApgYGAKCmBgYHtyfQoKZ2dzYXZlKHBsb3QgPSBmaWdzMi5maW5hbCwgcGF0aCA9ICJ+L3Bsb3RzL3BhcGVyMS9maWd1cmVzL2ZpZ18xL3N1cHBsZW1lbnRhbF9maWdzL2ZpZ19zMi8iLCBmaWxlbmFtZSA9ICJhaWNfZHlfdW5lc3QucGRmIiwgd2lkdGggPSA4LCBoZWlnaHQgPSA2ICkKZ2dzYXZlKHBsb3QgPSBmaWdzMi5maW5hbCwgcGF0aCA9ICJ+L3Bsb3RzL3BhcGVyMS9maWd1cmVzL2ZpZ18xL3N1cHBsZW1lbnRhbF9maWdzL2ZpZ19zMi8iLCBmaWxlbmFtZSA9ICJhaWNfZHlfdW5lc3QucG5nIiwgd2lkdGggPSA4LCBoZWlnaHQgPSA2ICkKYGBgCgojc2F2aW5nIGluZGl2aWR1YWwgcGxvdHMKYGBge3J9Cmdnc2F2ZShwbG90ID0gYWljLnNjb3JlLnB0RGVuUGx0LCBwYXRoID0gIn4vcGxvdHMvcGFwZXIxL2ZpZ3VyZXMvZmlnXzEvc3VwcGxlbWVudGFsX2ZpZ3MvZmlnX3MyL0dSQy8iLCBmaWxlbmFtZSA9ICJhaWNfc2NhdHRlclBsdC5wZGYiLCB3aWR0aCA9IDYsIGhlaWdodCA9IDMgKQpnZ3NhdmUocGxvdCA9IGR5Lm1vZGVscy5zY2F0UGx0LCBwYXRoID0gIn4vcGxvdHMvcGFwZXIxL2ZpZ3VyZXMvZmlnXzEvc3VwcGxlbWVudGFsX2ZpZ3MvZmlnX3MyL0dSQy8iLCBmaWxlbmFtZSA9ICJkeV9zY2F0dGVyUGx0LnBkZiIsIHdpZHRoID0gNSwgaGVpZ2h0ID0gMyApCmdnc2F2ZShwbG90ID0gZG0ucGVyLmxvdy5CYXJQbHQsIHBhdGggPSAifi9wbG90cy9wYXBlcjEvZmlndXJlcy9maWdfMS9zdXBwbGVtZW50YWxfZmlncy9maWdfczIvR1JDLyIsIGZpbGVuYW1lID0gImRtX3BlcmNlbnQucGRmIiwgd2lkdGggPSA1LCBoZWlnaHQgPSAzICkKZ2dzYXZlKHBsb3QgPSB1bmRlckVzdC5ieC5wbHQsIHBhdGggPSAifi9wbG90cy9wYXBlcjEvZmlndXJlcy9maWdfMS9zdXBwbGVtZW50YWxfZmlncy9maWdfczIvR1JDLyIsIGZpbGVuYW1lID0gInVuZGVyX2VzdC5wZGYiLCB3aWR0aCA9IDUsIGhlaWdodCA9IDQpCmBgYAoKI2xvb2tpbmcgYXQgbm9uLWV4cG9uZW50aWFsIGRlY2F5IAphZGQgdGhlIHRpbWVsYXBzZSBkYXRhCmBgYHtyfQphbGwuZXhwLmxpc3QgPC0gcmVhZF9jc3YoIn4vcGxvdHMvYWxsX2RhdGEvYWxsX2V4cF9kYXRhLmNzdiIpCmBgYAoKd2l0aCBwcm90ZWluIGluaGliaXRpb24KYGBge3J9CmFsbC5leHAubGlzdCAlPiUgCiAgZmlsdGVyKHRyZWF0bWVudCAhPSAibm9uZSIpICU+JSAKICBmaWx0ZXIoY2VsbC5pZCAlaW4lIHVuaXF1ZShhaWMuZGYkY2VsbC5pZCkpICU+JSAKICBsZWZ0X2pvaW4oLixhaWMuZGYgJT4lIAogICAgICAgICAgICAgIGZpbHRlcihtb2RlbCA9PSAiZHkuZG0iKSAlPiUgCiAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChjZWxsLmlkLCBkbSxkeSwgbW9kZWwsY29sb255KSwgCiAgICAgICAgICAgIGJ5ID0gImNlbGwuaWQiKSAlPiUgCiAgZ3JvdXBfYnkoY2VsbC5pZCkgJT4lIAogIG11dGF0ZShkbS5sZXZlbCA9IGlmZWxzZShkbSA8IDEsICJsb3ciLCAiaGlnaCIpLAogICAgICAgICBnZnAuaW50ID0gZ2ZwTWVhbkJnQUZzdWJbMV0pICU+JSAKICBuYS5vbWl0KCkgJT4lIAogIG11dGF0ZShJdF9JMCA9IGdmcE1lYW5CZ0FGc3ViL2dmcE1lYW5CZ0FGc3ViWzFdKSAlPiUgCiAgc3BsaXQoLiR0cmVhdG1lbnQpICU+JSAKICBtYXAoLixmdW5jdGlvbihhKXsKICAgIHRlbXAuMSA8LSBhCiAgICAgICMgZmlsdGVyKGNlbGwuaWQgJWluJSBzYW1wbGUoYSRjZWxsLmlkLCA1KSkgCiAgICAKICAgIHNsb3BlLmRmIDwtIGEgJT4lIAogICAgICBmaWx0ZXIoY2VsbC5pZCAlaW4lIHRlbXAuMSRjZWxsLmlkKSAlPiUgCiAgICAgIG11dGF0ZShzbG9wZTEgPSAobG9nKEl0X0kwWzMxXSkgLSAwKS8oKGRlbHRhLnRpbWVbMzFdLzYwKSAtIDApICkKICAgIAogICAgdGVtcC4xICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGRlbHRhLnRpbWUvNjAsIHkgPSBsb2coSXRfSTApLCBncm91cCA9IGNlbGwuaWQsIGNvbG9yID0gY2VsbC5pZCkpKwogIGdlb21fbGluZShhbHBoYSA9IDAuMikrCiAgZ3VpZGVzKGNvbG9yID0gIm5vbmUiKSArCiAgZ2VvbV9hYmxpbmUoZGF0YSA9IHNsb3BlLmRmICwgYWVzKGludGVyY2VwdCA9IDAsIHNsb3BlID0gc2xvcGUuZGYkc2xvcGUxLCBjb2xvciA9IGNlbGwuaWQpKSsKICBmYWNldF93cmFwKH5kbS5sZXZlbCwgc2NhbGVzID0gImZyZWVfeCIpKwogIHRoZW1lX3B1YnIoKSsKICAgICAgbGFicyh0aXRsZSA9IGEkdHJlYXRtZW50WzFdKQogIH0pCgpgYGAKCmFyZSB0aGUgZG0gdmFsdWVzID4gZHkgPyAKYGBge3J9CmZpZ1MyLmRmICU+JSAKICBmaWx0ZXIoZGVncm9uID09ICJtT0RDLjIiKSAlPiUgCiAgZmlsdGVyKG1vZGVsID09ICJkeS5kbSIsIGRtIDwgMSkgJT4lCiAgZ2dwbG90KC4sYWVzKHggPSBkeSwgeSA9IGRtKSkrCiAgZ2VvbV9wb2ludCgpKwogIHN0YXRfY29yKCkrCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxKQogIApgYGAKYGBge3J9CmFsbC5leHAubGlzdCAlPiUgCiAgZmlsdGVyKHRyZWF0bWVudCA9PSAibm9uZSIsIHJlZCA9PSAicHVwMS1yZnAiKSAlPiUgCiAgZmlsdGVyKGNlbGwuaWQgJWluJSB1bmlxdWUoYWljLmRmJGNlbGwuaWQpKSAlPiUgCiAgbGVmdF9qb2luKC4sYWljLmRmICU+JSAKICAgICAgICAgICAgICBmaWx0ZXIobW9kZWwgPT0gImR5LmRtIikgJT4lIAogICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QoY2VsbC5pZCwgZG0sZHksIG1vZGVsLGNvbG9ueSksIAogICAgICAgICAgICBieSA9ICJjZWxsLmlkIikgJT4lIAogIGdyb3VwX2J5KGNlbGwuaWQpICU+JSAKICBtdXRhdGUoZG0ubGV2ZWwgPSBpZmVsc2UoZG0gPCAxLCAibG93IiwgImhpZ2giKSwKICAgICAgICAgZ2ZwLmludCA9IGdmcE1lYW5CZ0FGc3ViWzFdKSAlPiUgCiAgbmEub21pdCgpICU+JSAKICBtdXRhdGUoSXRfSTAgPSBnZnBNZWFuQmdBRnN1Yi9nZnBNZWFuQmdBRnN1YlsxXSkgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gZGVsdGEudGltZS82MCwgeSA9IGxvZyhJdF9JMCksIGdyb3VwID0gY2VsbC5pZCkpKwogIGdlb21fbGluZShhbHBoYSA9IDAuMikrCiAgZmFjZXRfd3JhcCh+ZGVncm9uLCBzY2FsZXMgPSAiZnJlZSIpKwogIHRoZW1lX3B1YnIoKQpgYGAKCgpmb3IgZXhwZXJpbWVudHMgd2l0aG91dCBwcm90ZWluIGluaGliaXRpb24KYGBge3J9CmFsbC5leHAubGlzdCAlPiUgCiAgZmlsdGVyKHRyZWF0bWVudCA9PSAibm9uZSIpICU+JSAKICBmaWx0ZXIoY2VsbC5pZCAlaW4lIHVuaXF1ZShhaWMuZGYkY2VsbC5pZCkpICU+JSAKICBsZWZ0X2pvaW4oLixhaWMuZGYgJT4lIAogICAgICAgICAgICAgIGZpbHRlcihtb2RlbCA9PSAiZHkuZG0iKSAlPiUgCiAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChjZWxsLmlkLCBkbSxkeSwgbW9kZWwsY29sb255KSwgCiAgICAgICAgICAgIGJ5ID0gImNlbGwuaWQiKSAlPiUgCiAgZ3JvdXBfYnkoY2VsbC5pZCkgJT4lIAogIG11dGF0ZShkbS5sZXZlbCA9IGlmZWxzZShkbSA8IDEsICJsb3ciLCAiaGlnaCIpLAogICAgICAgICBnZnAuaW50ID0gZ2ZwTWVhbkJnQUZzdWJbMV0pICU+JSAKICBuYS5vbWl0KCkgJT4lIAogIG11dGF0ZShJdF9JMCA9IGdmcE1lYW5CZ0FGc3ViL2dmcE1lYW5CZ0FGc3ViWzFdKSAlPiUgCiAgc3BsaXQoLiRkZWdyb24pICU+JSAKICBtYXAoLixmdW5jdGlvbihhKXsKICAgIHRlbXAuMSA8LSBhICU+JSAKICAgICAgZmlsdGVyKGNlbGwuaWQgJWluJSBzYW1wbGUoYSRjZWxsLmlkLCA1KSkgCiAgICAKICAgIHNsb3BlLmRmIDwtIGEgJT4lIAogICAgICBmaWx0ZXIoY2VsbC5pZCAlaW4lIHRlbXAuMSRjZWxsLmlkKSAlPiUgCiAgICAgIG11dGF0ZShzbG9wZTEgPSAobG9nKEl0X0kwWzMxXSkgLSAwKS8oKGRlbHRhLnRpbWVbMzFdLzYwKSAtIDApICkKICAgIAogICAgdGVtcC4xICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGRlbHRhLnRpbWUvNjAsIHkgPSBsb2coSXRfSTApLCBncm91cCA9IGNlbGwuaWQsIGNvbG9yID0gY2VsbC5pZCkpKwogIGdlb21fbGluZShhbHBoYSA9IDAuMikrCiAgICAgIGd1aWRlcyhjb2xvciA9ICJub25lIikrCiAgZ2VvbV9hYmxpbmUoZGF0YSA9IHNsb3BlLmRmICwgYWVzKGludGVyY2VwdCA9IDAsIHNsb3BlID0gc2xvcGUuZGYkc2xvcGUxLCBjb2xvciA9IGNlbGwuaWQpKSsKICBmYWNldF93cmFwKH5kbS5sZXZlbCwgc2NhbGVzID0gImZyZWVfeCIpKwogIHRoZW1lX3B1YnIoKSsKICBsYWJzKHRpdGxlID0gYSRkZWdyb25bMV0pCiAgfSkKCgpgYGAKCmBgYHtyfQpkZXZpYXRpb24uZXhwIDwtIGFsbC5leHAubGlzdCAlPiUgCiAgZmlsdGVyKHRyZWF0bWVudCA9PSAibm9uZSIpICU+JSAKICBmaWx0ZXIoY2VsbC5pZCAlaW4lIHVuaXF1ZShhaWMuZGYkY2VsbC5pZCkpICU+JSAKICBsZWZ0X2pvaW4oLixhaWMuZGYgJT4lIAogICAgICAgICAgICAgIGZpbHRlcihtb2RlbCAlaW4lIGMoImR5LmRtIiwgImV4cG9uZW50aWFsIikpICU+JSAKICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KGNlbGwuaWQsIGRtLGR5LCBtb2RlbCxjb2xvbnkpLCAKICAgICAgICAgICAgYnkgPSAiY2VsbC5pZCIpICU+JSAKICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgbXV0YXRlKGRtID0gaWZlbHNlKGlzLm5hKGRtKSwgSW5mLCBkbSksCiAgICBkbS5sZXZlbCA9IGlmZWxzZShkbSA8IDEsICJsb3ciLCAiaGlnaCIpLAogICAgICAgICBnZnAuaW50ID0gZ2ZwTWVhbkJnQUZzdWJbMV0pICU+JSAKICBuYS5vbWl0KCkgJT4lIAogIG11dGF0ZShJdF9JMCA9IGdmcE1lYW5CZ0FGc3ViL2dmcE1lYW5CZ0FGc3ViWzFdKSAlPiUgCiAgbXV0YXRlKHNsb3BlMSA9IChsb2coSXRfSTBbMzFdKSAtIDApLygoZGVsdGEudGltZVszMV0vNjApIC0gMCksCiAgICAgICAgIGxuLkl0X0kwID0gbG9nKEl0X0kwKSwKICAgICAgICAgbmV3Lkl0X0kwID0gc2xvcGUxKmRlbHRhLnRpbWUvNjApICU+JSAKICBmaWx0ZXIoaW1hZ2Uubm8gPT0gMTUpICU+JSAKICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IGR5LCBuYW1lc19mcm9tID0gbW9kZWwpCiAgbXV0YXRlKGRlbHRhLnkgPSBsbi5JdF9JMCAtIG5ldy5JdF9JMCkgJT4lIAogIGRwbHlyOjpzZWxlY3QoZGVsdGEueSwgY2VsbC5pZCwgZHksIGRtKSAlPiUgCiAgbGVmdF9qb2luKC4scHVwMS5jZWxsLmF0dHIsIGJ5ID0gImNlbGwuaWQiKQoKYGBgCgpgYGB7cn0KZGV2aWF0aW9uLmV4cCAlPiUgCiAgZmlsdGVyKHJlZCA9PSAicHVwMS1yZnAiKSAlPiUgCiAgZmlsdGVyKGRlZ3JvbiA9PSAiY2xuMi4zIikgJT4lIAogIGdncGxvdCguLGFlcyh5ID0gZGVsdGEueSAsIHggPSBnZnAubWVhbi5iZy5hZi5zdWIubmV3KSkrCiAgZ2dwb2ludGRlbnNpdHk6Omdlb21fcG9pbnRkZW5zaXR5KHNpemUgPSAwLjIpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpKwogIHN0YXRfY29yKCkrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkrCiAgZmFjZXRfd3JhcChjb2xvbnl+ZGVncm9uLCBzY2FsZXMgPSAiZnJlZSIpCgpkZXZpYXRpb24uZXhwICU+JSAKICBmaWx0ZXIocmVkID09ICJwdXAxLXJmcCIsIGRtID4gMC4wMDAxKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHkgPSBkZWx0YS55ICwgeCA9IGdmcC5tZWFuLmJnLmFmLnN1Yi5uZXcpKSsKICBnZ3BvaW50ZGVuc2l0eTo6Z2VvbV9wb2ludGRlbnNpdHkoc2l6ZSA9IDAuMikrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikrCiAgc3RhdF9jb3IoKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSsKICBmYWNldF93cmFwKH5kZWdyb24sIHNjYWxlcyA9ICJmcmVlIikKCgpkZXZpYXRpb24uZXhwICU+JSAKICBmaWx0ZXIoZGVncm9uICVpbiUgYygibU9EQy4yIiwiY2xuMi4zIiwiY2xuMi40Iiwic3RhYmxlLjIiLCJzdGFibGUuMyIpKSAlPiUgCiAgZmlsdGVyKHJlZCA9PSAicHVwMS1yZnAiKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBkZWx0YS55ICwgZmlsbCA9IGRlZ3JvbikpKwogIGdlb21fZGVuc2l0eShhZXMoeSA9IC4uc2NhbGVkLi4pLCBhbHBoYSA9IDAuNSkKCmRldmlhdGlvbi5leHAgJT4lIAogIGZpbHRlcihkZWdyb24gJWluJSBjKCJtT0RDLjIiLCJjbG4yLjMiLCJjbG4yLjQiLCJzdGFibGUuMiIsInN0YWJsZS4zIikpICU+JSAKICBmaWx0ZXIocmVkID09ICJwdXAxLXJmcCIpICU+JSAKICBtdXRhdGUoZG0ubGV2ZWwgPSBpZmVsc2UoZG0gPiAxMCwgImhpZ2giLCJsb3ciKSkgJT4lIAogIGdncGxvdCguLGFlcyh4ID0gZGVsdGEueSAsIGZpbGwgPSBkbS5sZXZlbCkpKwogIGdlb21fZGVuc2l0eShhZXMoeSA9IC4uc2NhbGVkLi4pLCBhbHBoYSA9IDAuNSkrCiAgZmFjZXRfd3JhcCh+ZGVncm9uLCBzY2FsZXMgPSAiZnJlZSIpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApKwogIHhsaW0oLTAuNSwxKQoKYGBgCgpgYGB7cn0KZGV2aWF0aW9uLmV4cC5QcnRJbiA8LSBhbGwuZXhwLmxpc3QgJT4lIAogIGZpbHRlcihjZWxsLmlkICVpbiUgdW5pcXVlKGFpYy5kZiRjZWxsLmlkKSkgJT4lIAogIGxlZnRfam9pbiguLGFpYy5kZiAlPiUgCiAgICAgICAgICAgICAgZmlsdGVyKG1vZGVsID09ICJkeS5kbSIpICU+JSAKICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KGNlbGwuaWQsIGRtLGR5LCBtb2RlbCxjb2xvbnkpLCAKICAgICAgICAgICAgYnkgPSAiY2VsbC5pZCIpICU+JSAKICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgbXV0YXRlKGRtLmxldmVsID0gaWZlbHNlKGRtIDwgMSwgImxvdyIsICJoaWdoIiksCiAgICAgICAgIGdmcC5pbnQgPSBnZnBNZWFuQmdBRnN1YlsxXSkgJT4lIAogIG5hLm9taXQoKSAlPiUgCiAgbXV0YXRlKEl0X0kwID0gZ2ZwTWVhbkJnQUZzdWIvZ2ZwTWVhbkJnQUZzdWJbMV0pICU+JSAKICBtdXRhdGUoc2xvcGUxID0gKGxvZyhJdF9JMFszMV0pIC0gMCkvKChkZWx0YS50aW1lWzMxXS82MCkgLSAwKSwKICAgICAgICAgbG4uSXRfSTAgPSBsb2coSXRfSTApLAogICAgICAgICBuZXcuSXRfSTAgPSBzbG9wZTEqZGVsdGEudGltZS82MCkgJT4lIAogIGZpbHRlcihpbWFnZS5ubyA9PSAxNSkgJT4lIAogIG11dGF0ZShkZWx0YS55ID0gbG4uSXRfSTAgLSBuZXcuSXRfSTApICU+JSAKICBkcGx5cjo6c2VsZWN0KGRlbHRhLnksIGNlbGwuaWQpICU+JSAKICBsZWZ0X2pvaW4oLixwcm90SW5oaS5hdHRyLCBieSA9ICJjZWxsLmlkIikgJT4lIAogIGZpbHRlcih0cmVhdG1lbnQgIT0gIm5vbmUiKQpgYGAKCmBgYHtyfQpkZXZpYXRpb24uZXhwLlBydEluICU+JSAKICBmaWx0ZXIoISh0cmVhdG1lbnQgJWluJSBjKCJkbXNvMSIsIjUwdU0iKSkpICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGR5ICwgZmlsbCA9IHRyZWF0bWVudCkpKwogIGdlb21fZGVuc2l0eShhZXMoeSA9IC4uc2NhbGVkLi4pLCBhbHBoYSA9IDAuNSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkrCiAgdGhlbWVfcHVicigpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpKQoKZGV2aWF0aW9uLmV4cC5QcnRJbiAlPiUgCiAgZmlsdGVyKHRyZWF0bWVudCAlaW4lIGMoImRtc28xIiwiNTB1TSIpKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBkZWx0YS55ICwgZmlsbCA9IHRyZWF0bWVudCkpKwogIGdlb21fZGVuc2l0eShhZXMoeSA9IC4uc2NhbGVkLi4pLCBhbHBoYSA9IDAuNSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkrCiAgdGhlbWVfcHVicigpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpKQoKZGV2aWF0aW9uLmV4cC5QcnRJbiAlPiUgCiAgZ2dwbG90KC4sYWVzKHkgPSBkZWx0YS55ICwgeCA9IGdmcC5tZWFuLmJnLmFmLnN1Yi5uZXcpKSsKICBnZ3BvaW50ZGVuc2l0eTo6Z2VvbV9wb2ludGRlbnNpdHkoc2l6ZSA9IDAuMikrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikrCiAgc3RhdF9jb3IoKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSsKICBmYWNldF93cmFwKH50cmVhdG1lbnQsIHNjYWxlcyA9ICJmcmVlIikKYGBgCmBgYHtyfQpkZXZpYXRpb24uZXhwICU+JSAKICBmaWx0ZXIocmVkID09ICJwdXAxLXJmcCIpICU+JSAKICBzcGxpdCguJGRlZ3JvbikgJT4lIAogIG1hcCguLGZ1bmN0aW9uKGEpewogICAgYSA8LSBhICU+JSAKICAgICAgdW5ncm91cCgpICU+JSAKICAgICAgZHBseXI6OnNlbGVjdChkZWx0YS55LCBnZnAubWVhbi5iZy5hZi5zdWIubmV3LCByZnAubWVhbi5iZy5zdWIucHVuY3RhLCBhcmVhLCBkYXBpLnN1bS5iZy5zdWIucHVuY3RhKSAlPiUgCiAgICAgIG5hLm9taXQoKQogICAgcGNvcihhKQogIH0pCmBgYAoKYGBge3J9CmRldmlhdGlvbi5leHAgJT4lIAogIGZpbHRlcihyZWQgPT0gInB1cDEtcmZwIikgJT4lIAogIGZpbHRlcihkZWdyb24gJWluJSBjKCJtT0RDLjIiLCJjbG4yLjMiLCJjbG4yLjQiLCJzdGFibGUuMiIsInN0YWJsZS4zIikpICU+JSAKICBtdXRhdGUoZGVncm9uPSBjYXNlX3doZW4oZGVncm9uID09ICJtT0RDLjIiIH4gInllR0ZQLW1PREMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVncm9uICVpbiUgYygiY2xuMi4zIiwiY2xuMi40IikgfiAieWVHRlAtQ0xOMiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyb24gJWluJSBjKCJzdGFibGUuMiIgLCJzdGFibGUuMyIpIH4gInllR0ZQIiksIAogICAgICAgICBkZWdyb24gPSBmYWN0b3IoZGVncm9uLCBsZXZlbHMgPSBjKCJ5ZUdGUC1tT0RDIiwieWVHRlAtQ0xOMiIsInllR0ZQIikpKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHkgPSBkZWx0YS55ICwgeCA9IGdmcC5tZWFuLmJnLmFmLnN1Yi5uZXcpKSsKICBnZ3BvaW50ZGVuc2l0eTo6Z2VvbV9wb2ludGRlbnNpdHkoc2l6ZSA9IDAuMikrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikrCiAgc3RhdF9jb3IoKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSsKICBmYWNldF93cmFwKH5kZWdyb24sIHNjYWxlcyA9ICJmcmVlX3giKQoKZGV2aWF0aW9uLmV4cCAlPiUgCiAgZmlsdGVyKHJlZCA9PSAicHVwMS1yZnAiKSAlPiUgCiAgZmlsdGVyKGRlZ3JvbiAlaW4lIGMoIm1PREMuMiIsImNsbjIuMyIsImNsbjIuNCIsInN0YWJsZS4yIiwic3RhYmxlLjMiKSkgJT4lIAogIG11dGF0ZShkZWdyb249IGNhc2Vfd2hlbihkZWdyb24gPT0gIm1PREMuMiIgfiAieWVHRlAtbU9EQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyb24gJWluJSBjKCJjbG4yLjMiLCJjbG4yLjQiKSB+ICJ5ZUdGUC1DTE4yIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JvbiAlaW4lIGMoInN0YWJsZS4yIiAsInN0YWJsZS4zIikgfiAieWVHRlAiKSwgCiAgICAgICAgIGRlZ3JvbiA9IGZhY3RvcihkZWdyb24sIGxldmVscyA9IGMoInllR0ZQLW1PREMiLCJ5ZUdGUC1DTE4yIiwieWVHRlAiKSkpICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGRlbHRhLnkgLCBmaWxsID0gZGVncm9uKSkrCiAgZ2VvbV9kZW5zaXR5KGFlcyh5ID0gLi5zY2FsZWQuLiksIGFscGhhID0gMC41KSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSsKICB0aGVtZV9wdWJyKCkrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpCmBgYAoKYGBge3J9CmFsbC5leHAubGlzdCAlPiUgCiAgZmlsdGVyKHRyZWF0bWVudCA9PSAibm9uZSIpICU+JSAKICBmaWx0ZXIoY2VsbC5pZCAlaW4lIHVuaXF1ZShhaWMuZGYkY2VsbC5pZCkpICU+JSAKICBsZWZ0X2pvaW4oLixhaWMuZGYgJT4lIAogICAgICAgICAgICAgIGZpbHRlcihtb2RlbCAlaW4lIGMoImR5LmRtIiwgImV4cG9uZW50aWFsIikpICU+JSAKICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KGNlbGwuaWQsIGRtLGR5LCBtb2RlbCxjb2xvbnkpLCAKICAgICAgICAgICAgYnkgPSAiY2VsbC5pZCIpICU+JSAKICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgbXV0YXRlKGRtID0gaWZlbHNlKGlzLm5hKGRtKSwgSW5mLCBkbSksCiAgICBkbS5sZXZlbCA9IGlmZWxzZShkbSA8IDEsICJsb3ciLCAiaGlnaCIpLAogICAgICAgICBnZnAuaW50ID0gZ2ZwTWVhbkJnQUZzdWJbMV0pICU+JSAKICBuYS5vbWl0KCkgJT4lIAogIG11dGF0ZShJdF9JMCA9IGdmcE1lYW5CZ0FGc3ViL2dmcE1lYW5CZ0FGc3ViWzFdKSAlPiUgCiAgZHBseXI6OnNlbGVjdChjZWxsLmlkLCByZWQsbW9kZWwsIGR5LCBkZWx0YS50aW1lLGdmcE1lYW5CZ0FGc3ViLCBkZWdyb24sIGNvbG9ueSwgZ2ZwLmludCwgSXRfSTAsIGltYWdlLm5vKSAlPiUgCiAgIyBmaWx0ZXIoaW1hZ2Uubm8gPT0gMTApICU+JSAKICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IGR5LCBuYW1lc19mcm9tID0gbW9kZWwpICU+JSAKICBtdXRhdGUobmV3Lkl0X0kwID0gLWV4cG9uZW50aWFsKmRlbHRhLnRpbWUvNjAsIAogICAgICAgICBsbi5JdF9JMCA9IGxvZyhJdF9JMCksIAogICAgICAgICBkZWx0YS55ID0gIGxuLkl0X0kwIC0gbmV3Lkl0X0kwKSAlPiUgCiAgZmlsdGVyKGRlZ3JvbiAlaW4lIGMoIm1PREMuMiIsImNsbjIuMyIsImNsbjIuNCIsInN0YWJsZS4yIiwic3RhYmxlLjMiKSkgJT4lIAogIGZpbHRlcihyZWQgPT0gInB1cDEtcmZwIikgJT4lIAogICMgbXV0YXRlKGRtLmxldmVsID0gaWZlbHNlKGRtID4gMTAsICJoaWdoIiwibG93IikpICU+JSAKICBnZ3Bsb3QoLixhZXMoeCA9IGRlbHRhLnksIHkgPSBmYWN0b3IoaW1hZ2Uubm8sIGxldmVscyA9IGMoMzE6MikpICxmaWxsID0gZGVncm9uKSkrCiAgc3RhdF9kZW5zaXR5X3JpZGdlcyhnZW9tID0gImRlbnNpdHlfcmlkZ2VzX2dyYWRpZW50IiAsIAogICAgICAgICAgICAgICAgICAgICAgcXVhbnRpbGVzID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICBxdWFudGlsZV9saW5lcyA9IFRSVUUgLCAKICAgICAgICAgICAgICAgICAgICAgIGFlcyhoZWlnaHQgPSAuLm5kZW5zaXR5Li4pLCAKICAgICAgICAgICAgICAgICAgICAgIHJlbF9taW5faGVpZ2h0ID0gMC4wMSwgCiAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMC4xKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBzaXplID0gMC41KSsKICB4bGltKC0xLDEpCmBgYApgYGB7cn0KYWxsLmV4cC5saXN0ICU+JSAKICAjIGZpbHRlcih0cmVhdG1lbnQgIT0gIm5vbmUiKSAlPiUgCiAgZmlsdGVyKGNlbGwuaWQgJWluJSB1bmlxdWUoYWljLmRmJGNlbGwuaWQpKSAlPiUgCiAgbGVmdF9qb2luKC4sYWljLmRmICU+JSAKICAgICAgICAgICAgICBmaWx0ZXIobW9kZWwgJWluJSBjKCJkeS5kbSIsICJleHBvbmVudGlhbCIpKSAlPiUgCiAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChjZWxsLmlkLCBkbSxkeSwgbW9kZWwsY29sb255KSwgCiAgICAgICAgICAgIGJ5ID0gImNlbGwuaWQiKSAlPiUgCiAgZ3JvdXBfYnkoY2VsbC5pZCkgJT4lIAogIG11dGF0ZShkbSA9IGlmZWxzZShpcy5uYShkbSksIEluZiwgZG0pLAogICAgZG0ubGV2ZWwgPSBpZmVsc2UoZG0gPCAxLCAibG93IiwgImhpZ2giKSwKICAgICAgICAgZ2ZwLmludCA9IGdmcE1lYW5CZ0FGc3ViWzFdKSAlPiUgCiAgbmEub21pdCgpICU+JSAKICBtdXRhdGUoSXRfSTAgPSBnZnBNZWFuQmdBRnN1Yi9nZnBNZWFuQmdBRnN1YlsxXSkgJT4lIAogIGRwbHlyOjpzZWxlY3QoY2VsbC5pZCx0cmVhdG1lbnQsbW9kZWwsIGR5LCBkZWx0YS50aW1lLGdmcE1lYW5CZ0FGc3ViLCBkZWdyb24sIGNvbG9ueSwgZ2ZwLmludCwgSXRfSTAsIGltYWdlLm5vKSAlPiUgCiAgZmlsdGVyKGltYWdlLm5vID09IDE1KSAlPiUgCiAgcGl2b3Rfd2lkZXIodmFsdWVzX2Zyb20gPSBkeSwgbmFtZXNfZnJvbSA9IG1vZGVsKSAlPiUgCiAgbXV0YXRlKG5ldy5JdF9JMCA9IC1leHBvbmVudGlhbCpkZWx0YS50aW1lLzYwLCAKICAgICAgICAgbG4uSXRfSTAgPSBsb2coSXRfSTApLCAKICAgICAgICAgZGVsdGEueSA9ICBsbi5JdF9JMCAtIG5ldy5JdF9JMCkgJT4lIAogIGRwbHlyOjpzZWxlY3QoZGVsdGEueSwgY2VsbC5pZCkgJT4lIAogIGxlZnRfam9pbiguLHByb3RJbmhpLmF0dHIsIGJ5ID0gImNlbGwuaWQiKSAlPiUgCiAgZmlsdGVyKHRyZWF0bWVudCAhPSAibm9uZSIpICU+JSAKICBmaWx0ZXIodHJlYXRtZW50ICVpbiUgYygiZG1zbzEiLCI1MHVNIikpICU+JSAKICAjIG11dGF0ZShkbS5sZXZlbCA9IGlmZWxzZShkbSA+IDEwLCAiaGlnaCIsImxvdyIpKSAlPiUgCiAgZ2dwbG90KC4sYWVzKHggPSBkZWx0YS55ICwgZmlsbCA9IHRyZWF0bWVudCkpKwogIGdlb21fZGVuc2l0eShhZXMoeSA9IC4uc2NhbGVkLi4pLCBhbHBoYSA9IDAuNSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkrCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMC41LCAwLjUsIGJ5ID0gMC4xKSkrCiAgeGxpbSgtMC41LDAuNSkKYGBgCmBgYHtyfQphbGwuZXhwLmxpc3QgJT4lIAogICMgZmlsdGVyKHRyZWF0bWVudCAhPSAibm9uZSIpICU+JSAKICBmaWx0ZXIoY2VsbC5pZCAlaW4lIHVuaXF1ZShhaWMuZGYkY2VsbC5pZCkpICU+JSAKICBsZWZ0X2pvaW4oLixhaWMuZGYgJT4lIAogICAgICAgICAgICAgIGZpbHRlcihtb2RlbCAlaW4lIGMoImR5LmRtIiwgImV4cG9uZW50aWFsIikpICU+JSAKICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KGNlbGwuaWQsIGRtLGR5LCBtb2RlbCxjb2xvbnkpLCAKICAgICAgICAgICAgYnkgPSAiY2VsbC5pZCIpICU+JSAKICBncm91cF9ieShjZWxsLmlkKSAlPiUgCiAgbXV0YXRlKGRtID0gaWZlbHNlKGlzLm5hKGRtKSwgSW5mLCBkbSksCiAgICBkbS5sZXZlbCA9IGlmZWxzZShkbSA8IDEsICJsb3ciLCAiaGlnaCIpLAogICAgICAgICBnZnAuaW50ID0gZ2ZwTWVhbkJnQUZzdWJbMV0pICU+JSAKICBuYS5vbWl0KCkgJT4lIAogIG11dGF0ZShJdF9JMCA9IGdmcE1lYW5CZ0FGc3ViL2dmcE1lYW5CZ0FGc3ViWzFdKSAlPiUgCiAgZHBseXI6OnNlbGVjdChjZWxsLmlkLHRyZWF0bWVudCxtb2RlbCwgZHksIGRlbHRhLnRpbWUsZ2ZwTWVhbkJnQUZzdWIsIGRlZ3JvbiwgY29sb255LCBnZnAuaW50LCBJdF9JMCwgaW1hZ2Uubm8pICU+JSAKICAjIGZpbHRlcihpbWFnZS5ubyA9PSAxNSkgJT4lIAogIHBpdm90X3dpZGVyKHZhbHVlc19mcm9tID0gZHksIG5hbWVzX2Zyb20gPSBtb2RlbCkgJT4lIAogIG11dGF0ZShuZXcuSXRfSTAgPSAtZXhwb25lbnRpYWwqZGVsdGEudGltZS82MCwgCiAgICAgICAgIGxuLkl0X0kwID0gbG9nKEl0X0kwKSwgCiAgICAgICAgIGRlbHRhLnkgPSAgbG4uSXRfSTAgLSBuZXcuSXRfSTApICU+JSAKICBkcGx5cjo6c2VsZWN0KGRlbHRhLnksIGNlbGwuaWQsIGltYWdlLm5vKSAlPiUgCiAgbGVmdF9qb2luKC4scHJvdEluaGkuYXR0ciwgYnkgPSBjKCJjZWxsLmlkIikpICU+JSAKICBmaWx0ZXIodHJlYXRtZW50ICE9ICJub25lIikgJT4lIAogIGZpbHRlcighKHRyZWF0bWVudCAlaW4lIGMoImRtc28xIiwiNTB1TSIpKSkgJT4lIAogICMgbXV0YXRlKGRtLmxldmVsID0gaWZlbHNlKGRtID4gMTAsICJoaWdoIiwibG93IikpICU+JSAKIGdncGxvdCguLGFlcyh4ID0gZGVsdGEueSwgeSA9IGZhY3RvcihpbWFnZS5uby54LCBsZXZlbHMgPSBjKDMxOjIpKSAsZmlsbCA9IHRyZWF0bWVudCwgYWxwaGEgPSAwLjIpKSsKICBzdGF0X2RlbnNpdHlfcmlkZ2VzKGdlb20gPSAiZGVuc2l0eV9yaWRnZXNfZ3JhZGllbnQiICwgCiAgICAgICAgICAgICAgICAgICAgICBxdWFudGlsZXMgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgIHF1YW50aWxlX2xpbmVzID0gVFJVRSAsIAogICAgICAgICAgICAgICAgICAgICAgYWVzKGhlaWdodCA9IC4ubmRlbnNpdHkuLiksIAogICAgICAgICAgICAgICAgICAgICAgcmVsX21pbl9oZWlnaHQgPSAwLjAxLCAKICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAwLjEsIAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjIpKwogIGZhY2V0X3dyYXAofnRyZWF0bWVudCwgc2NhbGVzID0gImZyZWUiKSsKICB4bGltKC0xLDEpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApCmBgYAoKCg==